You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:25:07