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

如何优雅地将模板函数作为模板参数传递?

实现简洁的仿函数调用语法

完全可行,通过调整仿函数结构并使用模板模板参数,就能实现你想要的APPLY_FUNCTOR<SOMETHING>(a, b)简洁写法,具体实现如下:

核心思路

把原来“带静态模板函数的结构体”改成“携带模板参数的仿函数结构体”,同时将apply_10_times的第一个模板参数改为模板模板参数,让它能接收需要int类型模板参数的子算法模板。

具体实现代码

1. 重定义子算法仿函数

让每个子算法结构体本身绑定SOMETHING模板参数,并重载operator()作为逻辑执行入口:

#include <iostream>
using namespace std;

template<int SOMETHING>
struct apply_x_functor {
    // 重载operator(),直接接收参数执行逻辑
    void operator()(int &a, int &b) const {
        // 示例逻辑:根据SOMETHING修改a、b
        a += SOMETHING;
        b -= SOMETHING;
    }
};

template<int SOMETHING>
struct apply_y_functor {
    void operator()(int &a, int &b) const {
        // 另一种示例逻辑
        a *= SOMETHING;
        b /= SOMETHING;
    }
};

2. 调整apply_10_times的模板参数

将第一个参数改为模板模板参数(表示它是一个接收int类型参数的类模板),然后在循环中直接实例化仿函数并调用:

// 第一个参数是模板模板参数:接收int的类模板
template<template<int> class APPLY_FUNCTOR, int SOMETHING>
void apply_10_times(int &a, int &b) {
    for (int i = 0; i < 10; i++) {
        cout << SOMETHING << " ";
        // 实例化仿函数并调用operator(),写法简洁符合需求
        APPLY_FUNCTOR<SOMETHING>{}(a, b);
    }
}

3. 调用示例

int main() {
    int x = 0, y = 20;
    cout << "使用apply_x_functor,SOMETHING=3:\n";
    apply_10_times<apply_x_functor, 3>(x, y);
    cout << "\n结果:x=" << x << ", y=" << y << "\n\n";

    x = 2, y = 100;
    cout << "使用apply_y_functor,SOMETHING=2:\n";
    apply_10_times<apply_y_functor, 2>(x, y);
    cout << "\n结果:x=" << x << ", y=" << y << "\n";

    return 0;
}

原写法需要::template的原因

原来的代码中,APPLY_FUNCTOR是依赖模板参数的类型,编译器无法自动识别apply是模板函数还是普通成员,必须用::template明确标记。调整结构后,我们直接实例化带参数的仿函数类型,通过临时对象调用operator(),避免了复杂的依赖类型解析语法。

内容的提问来源于stack exchange,提问作者Daniel S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:39:45