如何优雅地将模板函数作为模板参数传递?
实现简洁的仿函数调用语法
完全可行,通过调整仿函数结构并使用模板模板参数,就能实现你想要的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.
相关产品推荐
相关产品推荐

