gpt4 book ai didi

c++ - 包装谓词仿函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:29 26 4
gpt4 key购买 nike

我想知道有关谓词仿函数打包的约定和最佳实践。例如,给定一个类:

class Timer
{
public:
Timer(const std::string& name, int interval);
bool nameIs(const std::string& name) const;
private:
std::string name_;
int interval_;
};

即(在一种情况下)在类 TimerVec 中使用:

class TimerVec
{
public:
typedef std::vector<Timer>::iterator iterator;``
<... ctors, etc ...>
iterator findByName(const std::string& name);
private:
std::vector<Timer> timers_;
};

并且有一个像这样的谓词仿函数:

class TimerNameIs
{
public:
TimerNameIs(const std::string& name) : name_(name) {}
bool operator()(const Timer& t) { return t.nameIs(name_); }
private:
const std::string& name_;
};

我可以想到很多放置仿函数代码的地方,其中一些是:

  1. 在Timer声明之后的头文件中
  2. 嵌套在 Timer 中(即 ref 变为 Timer::TimerNameIs)
  3. 嵌套在 TimerVec 中(目前是唯一的用户)
  4. TimerVec::findByName 实现之前的匿名命名空间中(也是唯一使用它的地方)

虽然这些中的任何一个都足够了,但我更喜欢 #2,但这不是我见过的事情。是否有任何支持特定选项的具体原因?

最佳答案

这是有待商榷的。我更喜欢创建一个嵌套类。这样,仅用于处理特定类型对象的仿函数在该对象内是命名空间范围内的。

我通常还将谓词命名为 match_xxx,其中 xxx 是我匹配的参数。

即:

class Timer
{
// ...
public:
class match_name : public std::unary_function<Timer, bool>
{
public:
match_name(const std::string& name) : name_(name) {}
bool operator()(const Timer& t) { return t.nameIs(name_); }
private:
const std::string& name_;
};
};

...这样使用:

std::find_if( v.begin(), v.end(), Timer::match_name("Flibbidy") );

我更喜欢这种方法,因为 6 个月后查看这段代码时,Timer::match_name("Flibbidy") 的语义非常清晰。

我也很小心地从 std::unary_function 派生我的仿函数(尽管我上面的派生可能有颠倒的参数)。

关于c++ - 包装谓词仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7746273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com