没有命名类类型

时间:2017-05-31 18:15:58

标签: c++ templates member-function-pointers syntactic-sugar

考虑这个template函数,调用class T对象的方法。

template<class T, void (T::*Method)()>
void circuitousInvoke(T* callee) {
    (callee->*Method)();
}

示例:

struct A {
    void test() {};
}

circuitousInvoke<A, &A::test>(new A);

由于参数callee中的circuitousInvoke已经知道类型T,有没有办法避免输入这种类型?

circuitousInvoke<&A::test>(new A);

修改

此问题仅涉及模板功能。在这种情况下,继承和其他基于类的解决方案不适用。 (在我的项目中使用包装器对象会比输入其他名称更糟糕。)

1 个答案:

答案 0 :(得分:8)

在带有auto

的C ++ 17中是可能的
template<auto Method, typename T>
void circuitousInvoke(T* callee) {
    (callee->*Method)();
}

然后

A a;
circuitousInvoke<&A::test>(&a);