我正在使用 C++ 模板来传递策略函子来改变我的函数的行为。它工作正常。我传递的仿函数是一个没有存储的无状态类,它只是以经典仿函数的方式重载了 () 运算符。
template <typename Operation> int foo(int a)
{
int b=Operation()(a);
/* use b here, etc */
}
我经常这样做,而且效果很好,而且我经常使用传入的 6 或 7 个模板化仿函数来制作模板!
但是我担心代码的优雅和效率。函子是无状态的,所以我假设 Operation() 构造函数是免费的,并且对函子的评估与内联函数一样有效,但像所有 C++ 程序员一样,我总是有一些挥之不去的疑问。
我的第二个问题是我是否可以使用另一种仿函数方法.. 一种不会覆盖 () 运算符的方法,而是将构造函数中的所有内容作为副作用!就像是:
struct Operation {
Operation(int a, int &b) { b=a*a; }
};
template <typename Operation> int foo(int a)
{
int b;
Operation(a,b);
/* use b here, etc */
}
我从未见过有人使用构造函数作为仿函数的“工作”,但它似乎应该工作。有什么优势吗?有什么缺点吗?我确实喜欢删除奇怪的双括号 "Operator()(a)" ,但这可能只是美观。