[英]Passing member function pointer as template parameter
我想创建一个包装类,它可以在模板的帮助下调用包装类的成员函数(任何类型)。 这是我到目前为止:
template <typename T>
class wrapper {
public:
template<typename R, R (T::*func)()>
void call_func() {
(wrapped.*func)();
}
private:
T wrapped;
};
class some_class {
private:
int i = 2;
public:
void some_func() {
std::cout << i << std::endl;
}
};
int main() {
wrapper<some_class> wr;
// How I need to call at the moment:
wr.call_func<void, &some_class::some_func>();
// How I want call:
wr.call_func<&some_class::some_func>();
return 0;
}
正如您在main
函数的注释中所看到的,我想调用包装函数而不显式指定包装成员函数的返回类型。 (如何)可以在C ++ 11中完成?
template<typename F>
void call_func(F func) {
(wrapped.*func)();
}
然后像这样打电话:
wr.call_func(&some_class::some_func);
如果你也想使用返回值,你需要这样:
template<typename F>
auto call_func(F func) -> decltype((std::declval<T>().*func)()) {
return (wrapped.*func)();
}
如果你有C ++ 14,你可以省略-> decltype(...)
部分并使用decltype(auto)
作为返回值。
如果您还想传递函数,可以使用可变参数模板并进行转发。
template<typename F, typename... Args>
decltype(auto) call_func(F func, Args&&... args) {
return (wrapped.*func)(std::forward<Args>(args)...);
}
你可以直接使用std::function
有关std::function
更多信息,请参阅: http : //en.cppreference.com/w/cpp/utility/functional/function
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.