如何修改C++类Foo,让filter可直接传入模板函数is_even?
解决C++中模板函数作为参数时的模板参数推导问题
当直接传递未指定模板参数的is_even(函数模板)给Foo::filter时,编译器无法自动推导要实例化的is_even版本——因为filter原本的模板参数Func需要绑定到一个具体的函数类型,而非函数模板本身。
修改方案1:指定filter的参数类型匹配Foo<T>(兼容C++11及以上)
修改Foo的filter函数,显式限定参数为接受T类型并返回bool的函数指针。编译器会根据Foo的T类型(此处为int)自动实例化对应的is_even<T>:
template <class T> struct Foo { T value; bool filter(bool (*func)(T)) { return func(value); } };
修改方案2:使用C20的auto参数简化实现(C20及以上)
利用C++20的auto函数参数特性,让编译器在调用func(value)时,根据value的类型自动推导is_even的模板参数:
template <class T> struct Foo { T value; bool filter(auto func) { return func(value); } };
完整示例代码(以方案2为例)
template <class T> bool is_even(T value) { return value % 2 == 0; } template <class T> struct Foo { T value; bool filter(auto func) { return func(value); } }; int main() { Foo<int> foo; foo.filter(is_even<int>); // 原有调用依然有效 foo.filter(is_even); // 现在可正常运行 }
内容的提问来源于stack exchange,提问作者mat
相关产品推荐
相关产品推荐

