使用带参数的函子通常如下所示:
// 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
,并且没有“双重定义”链接错误。
是否有任何性能损失或我看不到的任何其他缺点?
这种方法按预期工作,直到我在 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 中,不在 Release 中,并且状态
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));
}
它看起来像一个编译器错误,你怎么看?