使用带参数的仿函数通常如下:
// Definition:
struct some_functor_with_params
{
int ref;
explicit some_functor_with_params(int ref) : ref(ref) {}
bool operator ()(int i) const {return i == ref;}
};
// Usage:
std::vector<int> v;
std::find_if(v.begin(), v.end(), some_functor_with_params(42));
对于没有参数的仿函数,代码可能会变为
// Definition:
struct some_functor_without_params
{
bool operator ()(int i) const {return i == 42;}
};
// Usage:
std::vector<int> v;
std::find_if(v.begin(), v.end(), some_functor_without_params());
但我更喜欢以下用法:
std::vector<int> v;
std::find_if(v.begin(), v.end(), some_functor_without_params); // no parens
具有以下优点:
some_functor_without_params(i)
而不是some_functor_without_params()(i)
bool some_functor_with_params(int i) {return i == 42;}
我在头文件中以下列方式实现它:
namespace {
struct
{
bool operator ()(int i) const {return i == 42;}
} some_functor_without_params;
}
我认为结构不需要名称,因为它没有用户声明的构造函数(也没有析构函数,也没有任何需要结构名称的东西)。我将对象放在一个未命名的命名空间中,以便每个编译单元都有自己的some_functor_without_params
,并且没有&#39;双重定义&#39;链接错误。
是否有任何性能损失或任何其他我看不到的缺点?
这种方法按预期工作,直到我遇到一个非常奇怪的编译错误,Visual C ++ 2013在命名仿函数类型时消失了,即替换
struct
{
bool operator ()(int i) const {return i == 42;}
} some_functor_without_params;
与
struct some_functor_without_params_t
{
bool operator ()(int i) const {return i == 42;}
} some_functor_without_params;
错误仅发生在Debug中,而不是发布中,并且状态为
error C2039: '<unnamed-type-some_functor_without_param>': is not a member of 'my_namespace:: ?? A0xbf2cc73f'
在文件xstring
中,此处:
_Myt& operator+=(const _Elem *_Ptr)
{ // append [_Ptr, <null>) // <-- on this line(!)
return (append(_Ptr));
}
它看起来像编译器错误,你怎么看?