我试图在那里找出 - 一个很好的技术原因来定义一个只包含一个成员的类,这个成员恰好是operator()
。
我偶然发现了一个人 - 无论出于何种原因 - 创建了一个包含几个类的命名空间,但每个类只包含一个operator()
作为成员。
我很清楚,这些类可能会被用作方法(非常可能),但为什么这是一个很好的技术方法(我假设有一个很好的方法),而不是简单地定义一组单例类中的不同方法,在这种特殊情况下属于上面提到的命名空间。
命名空间类似于:
namespace myNamespace {
class ClassA {
public:
void operator()();
};
class ClassB {
public:
int operator()(arg1, arg2);
};
...
}
这仅仅是个人品味/风格的问题还是这是先进/精致设计的表现? 我认为这个设计包含了一些我尚未收集到的明智知识,但另一方面,我没有找到一篇文章或问题来讨论这个问题 - 这让我怀疑设计中的这种“明智的知识”。 / p>
这里的专家有什么要说的?
提前致谢!
修改
再次问好! 我接受这个问题是一个重复的问题,其答案是here。
“Functor”这个词我不知道,在试图找到我怀疑的答案时(在提出这个问题之前),我没有看到任何关于这个术语的引用。
我仍然接受谢尔盖的回答,因为他的回答向我介绍了这个词,他的解释是回答我的问题。他的答案 - 从我的观点来看 - 延伸到我在上面所说的链接中找到的答案。
谢谢!
答案 0 :(得分:6)
这种技术主要是通用编程和模板。为其定义operator()
的类称为functor
,这类的优点在于它可以在很多情况下与函数指针互换使用。例如:
template<class F>
void call_f(F f) {
f();
}
可以使用函数和函子。或者,更好的示例是STL算法,例如find_if
,copy_if
,remove_if
等。所有这些算法都有一个模板参数,可以是函数,函子或(案例)实际上是一个函子的一个lambda。
这类课程的另一个好处是它的类型定义了它的对象。函数指针只是一个函数指针,它总是需要指向一个特定的函数。但对于无状态仿函数(没有任何成员的仿函数),类型足以根据需要重新创建对象。例如,std::less
用于std::map
。它没有采用比较的实际对象,而是它的类型并从就地类型创建对象。