【发布时间】:2013-08-23 19:21:54
【问题描述】:
我想要一个基于给定回调函数检查特定条件的函数。
考虑这段代码:
class Foo{
template <class ParamType>
struct IsGood
{
typedef bool (*Check)(typename const ParamType*, int other);
};
template< typename ParamType >
void DoSmth(IsGood<ParamType>::Check isGood, const ParamType* param){
//...
if(isGood(param, some_int_calculated_here)) doSmthElse();
}
我想要的是:
bool checkEqualInt(int* i, int j){return *i==j;}
bool checkEqualFloat(float* i, float j){return *i==j;}
DoSmth(checkEqualInt, &i);
DoSmth(checkEqualFloat, &i_float);
(所有构造的例子来说明问题)
编译器不会得到它并抛出错误 C2664“无法在 bool(ParamType,int) 中从 bool(int*,int) 转换参数 1”
我有一个不使用的解决方案
template< typename ParamType, Check >
void DoSmth(Check isGood, const ParamType param)
哪个省略了检查函数的必要声明?
最好的解决方案是在函数本身中获取 IsGood() 标头。
【问题讨论】:
-
在回答之前我没有看到最后一行。为什么不能使用表示函子的模板参数?
-
为我工作:ideone.com/czNr1e(在必要时添加/删除
typename之后)。 -
@user2093113
checkEqualFloat不会工作。 -
@mfontanini 确实,但那是因为问题中指定的
checkEqualFloat与IsGood<float>::Check函数签名不匹配。更正签名以将int作为第二个参数起作用:ideone.com/vx6ao8。 -
@user2093113:您的代码正在运行。我只是忘记了一些事情:ParamTypes 是作为指针给出的。我更新了问题。对此感到抱歉。我想它必须是一样的。它可以工作但是在 IsGood 中省略指针并使用 "DoSmth(IsGood
::Check" 但它看起来很奇怪
标签: c++ templates callback c2664