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

C++中能否基于运算符生成模板实现通用算子代码?

答案

你示例中提到的template<operator O>语法C++标准暂不支持,但可以通过以下两种常用方案实现完全一致的需求,非常适合处理多个函数仅单步运算有差异、其余逻辑完全相同的场景:

方案1:使用标准库运算符函数对象(C++11及以上版本可用)

C++标准库的<functional>头文件已经封装了所有常用运算符对应的函数对象,例如std::plus对应加法、std::minus对应减法、std::multiplies对应乘法等,直接作为模板参数传入即可:

#include <functional>

template<typename Op>
int do_thing(int a, int b) {
  // 所有公共逻辑可以统一写在这里
  return Op{}(a, b);
}

int main() {
  // 加法调用,预期返回10
  int foo = do_thing<std::plus<int>>(7, 3);
  // 减法调用,预期返回4
  int bar = do_thing<std::minus<int>>(7, 3);
  return 0;
}

如果使用C++14及以上版本,可以用泛型版的运算符对象,不需要指定参数类型,通用性更强:

template<typename Op, typename T>
T do_thing(T a, T b) {
  // 公共逻辑统一写在这里
  return Op{}(a, b);
}

// 调用时自动推导参数类型
int int_res = do_thing<std::plus<>>(7, 3);
double double_res = do_thing<std::multiplies<>>(2.5, 4.0);

方案2:使用Lambda作为模板参数(C++20及以上版本可用)

如果需要自定义运算逻辑,想要更灵活的实现,可以直接将无状态Lambda作为模板参数传入:

template<auto Op>
auto do_thing(auto a, auto b) {
  // 公共逻辑统一写在这里
  return Op(a, b);
}

int main() {
  // 直接传入Lambda实现对应运算
  int foo = do_thing<[](auto x, auto y) { return x + y; }>(7, 3);
  int bar = do_thing<[](auto x, auto y) { return x - y; }>(7, 3);
  return 0;
}

上述两种方案都可以实现你需要的逻辑复用效果,不需要重复编写多份高度相似的函数。

内容的提问来源于stack exchange,提问作者brenzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:36:01