【问题标题】:Templated member function pointer as template parameter模板化成员函数指针作为模板参数
【发布时间】:2013-01-05 19:57:30
【问题描述】:

我希望接受一个模板化的成员函数作为模板参数。

例如,给定这个类:

class A
{
public:
    template<typename... Args>
    void Foo(Args...) {}

    void Bar() {}
};

我希望能够打电话:

Invoke<&A::Foo>(5, true);

这类似于调用:

A a;
a.Foo(5, true);

我知道如何为Bar() 执行此操作:

template<void (A::*F)()>
void Invoke()
{
    A a;
    (a.*F)();
}

int main()
{
    Invoke<&A::Bar>();
}

是否可以将此扩展为模板化的成员函数指针?或者类似地,编写这样的转发函数,可以处理具有任何参数类型的函数。这不起作用,但类似于:

template<typename... Args, void (A::*F)(Args...)>
void Invoke(Args... args)
{
    A a;
    (a.*F)(args...);
}

我知道为什么这可能是不可能的,但如果这是真的,你能指出为什么的标准吗?我也在尝试更多地了解该标准的细节。

【问题讨论】:

  • 试试Invoke&lt;&amp;A::Foo&lt;int, bool&gt;&gt;(5, true)。如果可行,请编写一个类型推断包装器 function 模板。
  • @KerrekSB 但我不知道如何在函数类型中指定 Invoke 应该接受具有此签名的函数(不对其进行硬编码),因为您在指定时似乎必须指定参数成员函数指针类型。
  • 好吧,你可以让Invoke成为一个更强大的模板...
  • @KerrekSB 这就是问题所在。

标签: c++ templates c++11 variadic-templates


【解决方案1】:

是否可以将此扩展为模板化的成员函数指针?

没有。虽然如果您只需要 Foo 的特定实例化,您可以使用 Invoke&lt;&amp;A::Foo&lt;int, bool&gt;&gt;

或者类似地,编写一个这样的转发函数,可以处理具有任何参数类型的函数。

为了能够使用不同的签名,您必须修改Invoke 以对任何类型的可调用 对象进行操作。然后,您必须定义一个 callable 对象来调用您的实际函数:

struct callable_foo
{
    explicit callable_foo( A& obj ) : _obj( obj ){}

    template< typename ...Args >
    void operator ()( Args&&... args )
    {
         _obj.Foo( std::forward< Args >( args )... );
    }

    A& _obj;
}

【讨论】:

  • 你的意思是std::forward&lt;Args&gt;(args)...而不是std::forward&lt;Args...&gt;(args)
  • @Nawaz:好的,谢谢。还在追赶完美转发
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多