为什么要创建一个 class,其中只有一个成员是 operator()?
Why would you create a class with one single member which is an operator()?
我试图找出 - 在那里 - 一个很好的技术理由来定义一个 class ,它只包含一个成员,而这个成员恰好是 operator()
.
我偶然发现有人 - 无论出于何种原因 - 创建了一个包含几个 class 的名称空间,但每个 class 仅包含一个 operator()
作为成员。
我很清楚这些 classes 可能会像方法一样被使用(很有可能),但为什么这是一个很好的技术方法(我假设有一个很好的方法),而不是简单地在单例 class 中定义一组不同的方法,在这种特殊情况下,它属于我上面提到的命名空间。
名称空间类似于:
namespace myNamespace {
class ClassA {
public:
void operator()();
};
class ClassB {
public:
int operator()(arg1, arg2);
};
...
}
这只是个人taste/style的问题还是advance/sophisticated设计的表现?
我假设这个设计包含一些我还没有收集到的智慧知识,但另一方面我还没有找到一篇讨论这个的文章或问题 - 这让我对设计中的这种 "wise knowledge" 产生了怀疑。
这里的专家有什么要说的?
提前致谢!
编辑
大家好!
我接受这个问题是一个重复的问题,其答案已找到 here.
我不知道 Functor 这个词,在试图找到我的疑问的答案时(在提交这个问题之前),我没有看到任何对这个词的引用。
我仍然接受 SergeyA 的回答,因为他的回答向我介绍了这个词,他的解释正在回答我的问题。他的回答 - 从我的角度来看 - 由 link 我在上面陈述的行中找到的答案扩展。
谢谢!
这种技术主要是通过通用编程和模板来实现的。为它定义了 operator()
的 class 称为 functor
,这种 class 的美妙之处在于它可以在许多情况下与函数指针互换使用。例如:
template<class F>
void call_f(F f) {
f();
}
将与函数和仿函数一起使用。或者,更好的例子是 STL 算法,例如 find_if
、copy_if
、remove_if
等。它们都有一个模板参数,可以是函数、函子或(一个案例实际上是一个函子)一个 lambda。
这种 class 的另一个好处是它的类型定义了它的对象。函数指针只是一个函数指针,它总是需要指向一个特定的函数。但是对于无状态仿函数(没有任何成员的仿函数),类型足以根据需要重新创建对象。例如,这就是 std::less
用于 std::map
的方式。它不接受比较的实际对象,但它是类型并根据类型就地创建对象。
我试图找出 - 在那里 - 一个很好的技术理由来定义一个 class ,它只包含一个成员,而这个成员恰好是 operator()
.
我偶然发现有人 - 无论出于何种原因 - 创建了一个包含几个 class 的名称空间,但每个 class 仅包含一个 operator()
作为成员。
我很清楚这些 classes 可能会像方法一样被使用(很有可能),但为什么这是一个很好的技术方法(我假设有一个很好的方法),而不是简单地在单例 class 中定义一组不同的方法,在这种特殊情况下,它属于我上面提到的命名空间。
名称空间类似于:
namespace myNamespace {
class ClassA {
public:
void operator()();
};
class ClassB {
public:
int operator()(arg1, arg2);
};
...
}
这只是个人taste/style的问题还是advance/sophisticated设计的表现? 我假设这个设计包含一些我还没有收集到的智慧知识,但另一方面我还没有找到一篇讨论这个的文章或问题 - 这让我对设计中的这种 "wise knowledge" 产生了怀疑。
这里的专家有什么要说的?
提前致谢!
编辑
大家好! 我接受这个问题是一个重复的问题,其答案已找到 here.
我不知道 Functor 这个词,在试图找到我的疑问的答案时(在提交这个问题之前),我没有看到任何对这个词的引用。
我仍然接受 SergeyA 的回答,因为他的回答向我介绍了这个词,他的解释正在回答我的问题。他的回答 - 从我的角度来看 - 由 link 我在上面陈述的行中找到的答案扩展。
谢谢!
这种技术主要是通过通用编程和模板来实现的。为它定义了 operator()
的 class 称为 functor
,这种 class 的美妙之处在于它可以在许多情况下与函数指针互换使用。例如:
template<class F>
void call_f(F f) {
f();
}
将与函数和仿函数一起使用。或者,更好的例子是 STL 算法,例如 find_if
、copy_if
、remove_if
等。它们都有一个模板参数,可以是函数、函子或(一个案例实际上是一个函子)一个 lambda。
这种 class 的另一个好处是它的类型定义了它的对象。函数指针只是一个函数指针,它总是需要指向一个特定的函数。但是对于无状态仿函数(没有任何成员的仿函数),类型足以根据需要重新创建对象。例如,这就是 std::less
用于 std::map
的方式。它不接受比较的实际对象,但它是类型并根据类型就地创建对象。