我只是在为一组基于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
,没有办法组成negate
与fabs
.
为了回应你的编辑,我强调,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()
,但标准的库并不旨在提供任何这样的东西.