如何从实际函数中推导出 std::function 参数?
How to deduce `std::function` parameters from actual function?
给定一个 class
class Foo {
public:
std::shared_ptr<const Bar> quux(const std::string&, std::uint32_t);
}
我可以声明一个具有相同接口的std::function
:
std::function<std::shared_ptr<const Bar>(const std::string&, std::uint32_t)> baz = ...
有没有一种方法可以压缩该声明,使 std::function
的模板参数派生自该方法的声明,例如:
std::function<functype(X::quux)> baz = ...
其中 functype
是类似于 decltype
的虚构 C++ 运算符。有没有办法做到这一点/c++ 有这样的能力吗?
我确实看到该方法实际上有一个稍微不同的签名,因为它也需要一个 reference/pointer 到 this
对象;我也可以导出这样的签名。
是的,你可以。根据您的要求调整 How do I get the argument types of a function pointer in a variadic template class?,我们得到:
template<typename T>
struct function_traits;
template<typename R, typename C, typename ...Args>
struct function_traits<R(C::*)(Args...)>
{
using type = std::function<R(Args...)>;
};
class Bar;
class Foo {
public:
std::shared_ptr<const Bar> quux(const std::string&, std::uint32_t);
};
int main()
{
std::cout << std::is_same<
std::function<std::shared_ptr<const Bar>(const std::string&, std::uint32_t)>,
function_traits<decltype(&Foo::quux)>::type>::value << std::endl;
}
要使其与常量方法一起使用,您需要另一个专业化:
template<typename R, typename C, typename ...Args>
struct function_traits<R(C::*)(Args...) const>
{
using type = std::function<R(Args...)>;
};
但是你会遇到重载方法的问题,因为为了解决重载问题,你无论如何都需要指定参数。
给定一个 class
class Foo {
public:
std::shared_ptr<const Bar> quux(const std::string&, std::uint32_t);
}
我可以声明一个具有相同接口的std::function
:
std::function<std::shared_ptr<const Bar>(const std::string&, std::uint32_t)> baz = ...
有没有一种方法可以压缩该声明,使 std::function
的模板参数派生自该方法的声明,例如:
std::function<functype(X::quux)> baz = ...
其中 functype
是类似于 decltype
的虚构 C++ 运算符。有没有办法做到这一点/c++ 有这样的能力吗?
我确实看到该方法实际上有一个稍微不同的签名,因为它也需要一个 reference/pointer 到 this
对象;我也可以导出这样的签名。
是的,你可以。根据您的要求调整 How do I get the argument types of a function pointer in a variadic template class?,我们得到:
template<typename T>
struct function_traits;
template<typename R, typename C, typename ...Args>
struct function_traits<R(C::*)(Args...)>
{
using type = std::function<R(Args...)>;
};
class Bar;
class Foo {
public:
std::shared_ptr<const Bar> quux(const std::string&, std::uint32_t);
};
int main()
{
std::cout << std::is_same<
std::function<std::shared_ptr<const Bar>(const std::string&, std::uint32_t)>,
function_traits<decltype(&Foo::quux)>::type>::value << std::endl;
}
要使其与常量方法一起使用,您需要另一个专业化:
template<typename R, typename C, typename ...Args>
struct function_traits<R(C::*)(Args...) const>
{
using type = std::function<R(Args...)>;
};
但是你会遇到重载方法的问题,因为为了解决重载问题,你无论如何都需要指定参数。