2

使用带参数的函子通常如下所示:

// 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));
    }

它看起来像一个编译器错误,你怎么看?

4

0 回答 0