我使用此delegate implementation作为起点,并将其更新为使用varidadic模板。
我还试图创建一个 createCallback -function,它会在一个实例中创建一个Callback对象,但是出现了一个我不完全理解的编译错误。
一个非常基本的可编译示例(为清晰起见,我删除了 Callback 类):
template<typename R, class T, typename ...P>
class MemberCallbackFactory
{
public:
template<R (T::*Func)(P...)>
inline static void Bind(T* o)
{
//
}
};
template<typename R, class T, typename ...P>
inline void
createCallback(T* obj, R (T::*Func)(P...))
{
MemberCallbackFactory<R, T, P...>().template Bind<Func>(obj);
}
class Test
{
public:
void doSomething(int val)
{
//
}
};
int main()
{
Test t;
// Works:
MemberCallbackFactory<void, Test, int>().Bind<&Test::doSomething>(&t);
// Produces compile error:
createCallback(&t, &Test::doSomething);
return 0;
}
使用C ++ 11使用gcc4.9.2编译此示例将返回:
test2.cpp:11:28: note: template argument deduction/substitution failed:
test2.cpp:21:9: error: ‘func’ is not a valid template argument for type ‘void (Test::*)(int)’
MemberCallbackFactory<R, T, P...>().template Bind<func>(obj);
^
test2.cpp:21:9: error: it must be a pointer-to-member of the form ‘&X::Y’
test2.cpp:21:9: error: could not convert template argument ‘func’ to ‘void (Test::*)(int)’
因此,如果我将&amp; Test :: doSomething传递给 createCallback 作为 Func 参数,为什么我无法将其转发到Bind方法?不应该是正确的类型吗?
如果我将 createCallback 函数的一部分移动到 main 中,它编译得很好。
答案 0 :(得分:3)
您不能将Func
用作模板参数,因为它不会评估为常量表达式。同样的问题:
template<int> void foo() {}
int A = 5;
foo<A>();