授课
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
是一个虚构的C ++运算符,类似于decltype
。有没有办法做到/ c++是否具有这种能力?
我确实看到该方法的签名实际上稍有不同,因为它也需要对this
对象的引用/指针。我也可以派出这样的签名。
答案 0 :(得分:5)
是的,可以。使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...)>;
};
但是您会遇到重载方法的问题,因为要解决重载,您仍然需要指定参数。