我正在使用 C++ 模板传入 Strategy 仿函数以更改函数的行为。它工作正常。我传递的仿函数是一个没有存储的无状态类,它只是以经典的仿函数方式重载 () 运算符。
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)",但这可能只是为了美观。
最佳答案
Any disadvantage?
- Ctor 不返回任何有用的值——不能用于链式调用(例如 foo(bar())。
- 他们可以 throw 。
- 设计观点 -- 构造函数是对象创建函数,并不是真正的主力。
关于c++ - Functor 类在构造函数中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622048/