C 函数调用包装器包含类成员功能作为模板参数
C++ function call wrapper with class member function as template argument
我尝试使用此代码,但它与类成员功能不起作用。有没有一种方法可以生成类成员功能的包装器,并将其称为非班级成员的包装器?
#include <functional>
template <typename F>
class wrapper;
template <typename F, typename... Args>
typename std::result_of<F(Args...)>::type execute_helper (F&& f, Args&&... args) {
return std::forward<F>(f)( std::forward<Args>(args)...);
}
template<typename Ret, typename... Args>
class wrapper <std::function<Ret(Args...)>>
{
std::function<Ret(Args...)> m_f;
public:
wrapper( std::function<Ret(Args...)> f ): m_f(f) {}
Ret operator()(Args... args) const {
return execute_helper (m_f, args...);
}
};
成员函数的问题是他们需要一个名为类的对象。
假设您可以将类的对象以及指向成员函数的指针传递给构造函数,我想您可以按照以下方式编写包装器
template <typename Ret, typename Cl, typename ...Args>
class wrapper <Ret(Cl::*)(Args...)>
{
private:
std::function<Ret(Args...)> m_f;
public:
wrapper (Cl cl, Ret(Cl::*m)(Args...))
: m_f{ [=](Args... as) mutable { return (cl.*m)(as...); } }
{ }
Ret operator() (Args... args) const
{ return m_f(args...); }
};
以下是使用的完整汇编示例
#include <functional>
#include <iostream>
template <typename F>
class wrapper;
template <typename Ret, typename Cl, typename ...Args>
class wrapper <Ret(Cl::*)(Args...)>
{
private:
std::function<Ret(Args...)> m_f;
public:
wrapper (Cl cl, Ret(Cl::*m)(Args...))
: m_f{ [=](Args... as) mutable { return (cl.*m)(as...); } }
{ }
Ret operator() (Args... args) const
{ return m_f(args...); }
};
struct foo
{
long long bar (int a, long b, long long c)
{ return a+b+c; }
};
int main ()
{
foo f;
wrapper<decltype(&foo::bar)> wfb{f, &foo::bar};
std::cout << wfb(1, 2l, 3ll) << std::endl;
}
观察该示例适用于非const成员函数。
对于const成员函数,您可能需要另一个包装器
template <typename Ret, typename Cl, typename ...Args>
class wrapper <Ret(Cl::*)(Args...) const>
{
private:
std::function<Ret(Args...)> m_f;
public:
wrapper (Cl const & cl, Ret(Cl::*m)(Args...) const)
: m_f{ [=](Args... as) { return (cl.*m)(as...); } }
{ }
Ret operator() (Args... args) const
{ return m_f(args...); }
};
在这两种情况下,您都可以提高 operator()
添加完美转发
template <typename ... As>
Ret operator() (As && ... as) const
{ return m_f(std::forward<As>(as)...); }
相关文章:
- 对可变参数使用声明.如何选择正确的功能
- 如何在C++中调用默认模板功能参数?
- 如何从其他功能C++访问参数?
- 如何定义可变参数类模板的成员模板功能
- C++ std::enable_if - 第二个参数的功能
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 具有C++迭代器参数的多功能函数
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C 函数调用包装器包含类成员功能作为模板参数
- 非拖动功能模板参数包的合法使用
- 组件X86转换为ARM功能呼叫,其中有不同数量的参数为ARM
- 公共功能以私人课程为参数
- 如何部分专业化功能以用元组元素作为参数调用功能
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- std ::功能作为默认参数的功能
- C 功能模板指定第二个模板参数类型
- 传递多个参数的功能,该函数将类包含到其他函数
- 别名一个模板函数,该功能没有参数可更简洁
- 如何推断for_each的模板参数功能
- 用户界面-GUI和文本模式C++设计,以消除冗余(可选参数?功能过载?)