1

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

例如,给定这个类:

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...);
}

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

4

1 回答 1

2

是否可以将其扩展到模板化成员函数指针?

不,虽然如果你只需要一个特定的实例,Foo你可以使用Invoke<&A::Foo<int, bool>>.

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

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

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;
}
于 2013-01-05T20:03:41.130 回答