为什么unary_function没有定义operator()?

Gre*_*jan 6 c++

我只是在为一组基于take和int并返回void的仿函数寻找一个方便的基类.

思考使用std /功能的仿函数基本上将是unary_function<int,void>operator().

为什么virtual result_type operator()(const argument_type& _Left) const = 0;没有在unary_function模板上定义?我猜这是因为constness中可能存在变化......
是否有其他模板我错过了包括operator()

我有一段时间没有这样做,我错过了什么吗?

我怎样才能利用现有的功能

std::ptr_fun< HWND, void >(someFunction);
std::pointer_to_unary_function<HWND, void>(someFunction);
Run Code Online (Sandbox Code Playgroud)

编辑: 也许我应该包括另外一半的用法来完成这个.也许这是一半不适合这个概念的用法.

如何将仿函数传递给方法并使用它?

typedef unary_function<int,void> Functor;

void DoStuff(const Functor& functor) {
  int demo = 1;
  functor(demo);
}
Run Code Online (Sandbox Code Playgroud)

functor作为unary_function没有定义operator(),因此DoStuff不会编译.

Ste*_*sop 10

模板概念是鸭型的.满足UnaryFunction概念需求的类operator()在文档中指定并从使用满足该概念的模板参数的模板推断出的事实.没有必要拼写出函数签名,或者要求它是virtual一个const引用参数,或者它是一个const成员函数.

unary_function不应将模板视为接口(并且它不是设计为一个接口).它当然不是一个多态基类.它是一个帮助程序,由希望实现该AdaptableUnaryFunction概念的类使用.

来自STL文档,它们对于原始设计原理是可靠的:"它存在的唯一原因是使定义Adaptable一元函数更方便" - http://www.sgi.com/tech/stl/unary_function.html

标准类似:"提供以下类来简化参数和结果类型的typedef"(20.3.1/1)

高级用法 - 实际上,UnaryFunction需要的是if f是一元函数对象,并且x可以转换为参数类型,那么它f(x)是结果类型的有效表达式.它根本不需要一个参数operator(),没有一个两个arg operator(),第二个arg有一个默认值.尝试将其定义为纯虚函数;-)

第二个问题,你ptr_fun只需要用函数名/指针调用它即可.其模板参数将从函数类型推断出来,因此您无需指定它们.结果是相应pointer_to_unary_function模板类型的对象.

要直接使用STL文档中的示例:

transform(first, last, first,
    compose1(negate<double>, ptr_fun(fabs)));
Run Code Online (Sandbox Code Playgroud)

这大致相当于:

for (auto current = first; current != last; ++current) {
    *current = -fabs(*current);
}
Run Code Online (Sandbox Code Playgroud)

(我用auto它的C++ 0x意义,意思是"我不能打扰/这里不可能写迭代器类型")

可以使用函数名称/指针transform(采用UnaryFunction模板参数),但不能使用compose1(采用AdapatableUnaryFunction模板参数).因此,没有ptr_fun,没有办法组成negatefabs.

为了回应你的编辑,我强调,unary_function不是一个多态基类.您无法将其(或其任何实例化)用作函数参数类型.

如果要使用UnaryFunction或AdaptableUnaryFunction概念,则必须编写函数模板:

template <typename UnaryFunction>
void DoStuff(UnaryFunction &functor) {
    int demo = 1;
    functor(demo);
}
Run Code Online (Sandbox Code Playgroud)

但这只要求仿函数采用可int转换为的类型.它不需要完全准确地int返回void.这通常是一个优势.

如果模板没有做你想要的,那么unary_function不适合你.你没有错过任何东西:你可以用虚拟设计你自己的界面operator(),但标准的库并不旨在提供任何这样的东西.