C++ 通过模板传递成员函数指针
我将此作为起点,并将其更新为使用varidadic模板 我还尝试创建一个createCallback函数,该函数将在一个实例中创建回调对象,但得到一个编译错误,我不完全理解 一个非常基本的可编译示例如下(为了清晰起见,我删除了回调类):C++ 通过模板传递成员函数指针,c++,function,c++11,templates,C++,Function,C++11,Templates,我将此作为起点,并将其更新为使用varidadic模板 我还尝试创建一个createCallback函数,该函数将在一个实例中创建回调对象,但得到一个编译错误,我不完全理解 一个非常基本的可编译示例如下(为了清晰起见,我删除了回调类): 模板 类MemberCallbackFactory { 公众: 模板 内联静态无效绑定(T*o) { // } }; 模板 内联空隙 createCallback(T*obj,R(T::*Func)(P…) { MemberCallbackFactory()。模
模板
类MemberCallbackFactory
{
公众:
模板
内联静态无效绑定(T*o)
{
//
}
};
模板
内联空隙
createCallback(T*obj,R(T::*Func)(P…)
{
MemberCallbackFactory()。模板绑定(obj);
}
课堂测试
{
公众:
无效剂量测定(int val)
{
//
}
};
int main()
{
试验t;
//作品:
MemberCallbackFactory().Bind(&t);
//生成编译错误:
createCallback(&t,&Test::doSomething);
返回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)’
test2.cpp:11:28:注意:模板参数推断/替换失败:
test2.cpp:21:9:错误:“func”不是类型“void(Test::*)(int)”的有效模板参数
MemberCallbackFactory()。模板绑定(obj);
^
test2.cpp:21:9:错误:它必须是指向格式为“&X::Y”的成员的指针
test2.cpp:21:9:错误:无法将模板参数“func”转换为“void(Test::*)(int)”
因此,如果我将&Test::doSomething作为Func参数传递给createCallback,为什么我不能将其转发给Bind方法?它不应该是正确的类型吗
如果我将createCallback函数的一部分移到main中,它就可以正常编译。不能将
Func
用作模板参数,因为它的计算结果不是常量表达式。同样的问题:
template<int> void foo() {}
int A = 5;
foo<A>();
模板void foo(){}
INTA=5;
foo();
宁可使用std::function
和lambda表达式,也不要使用std::bind
或您自己的bind()
函数。@user0042:这是我正在考虑的一个选项。不过,我想了解这种情况下的问题是什么。在createCallback
中,Func
是一个参数,即可能是一个运行时值。这就是为什么你不能用它作为模板参数。谢谢你的澄清。现在完全有道理了。假期里不应该做那种事:-/
template<int> void foo() {}
int A = 5;
foo<A>();