我希望有一个函数,根据给定的回调函数检查某些条件。
考虑以下代码:
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“将参数1从bool(int *,int)转换为bool(ParamType,int)不可能”。
有没有不使用的解决方案
template< typename ParamType, Check >
void DoSmth(Check isGood, const ParamType param)
哪个省略了check函数的必要声明?
最好的解决方案是在函数本身中获得IsGood()头。
checkEqualFloat
不会起作用。 - mfontaninicheckEqualFloat
与IsGood<float> :: Check
函数签名不匹配。将签名更正为以“int”作为第二个参数的函数即可解决:http://ideone.com/vx6ao8。 - user2093113