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
相关产品推荐
相关产品推荐

