c++ - Functor 类在构造函数中工作

标签 c++ templates functor strategy-pattern

我正在使用 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/

相关文章:

c++ - pthread_create 没有参数?

c++ - C++ 中的 int 和 const int

c++ - 什么时候两个函数模板被认为是部分有序的,什么时候是不明确的?

c++ - 使用 `void_t`检测多重继承类型重复错误

haskell - Haskell 中的基本仿函数

monads - 在 Coq 中定义 Maybe monad

C++ 使用成员字段设置比较器

c++ - 概念评估能否取决于评估的位置?

templates - 渲染 Play!Framework2 javascript 作为模板?

c++ - 嵌套名称说明符中的类型名称不完整