【发布时间】:2011-10-13 05:07:41
【问题描述】:
我想知道有关包装谓词函子的约定和最佳实践。例如,给定一个类:
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_;
};
我可以想到很多地方可以放置仿函数代码,其中一些是:
- 在紧跟 Timer 声明的头文件中
- 嵌套在 Timer 内(即,引用变为
Timer::TimerNameIs) - 嵌套在 TimerVec 中(当前唯一的用户)
- 在实现
TimerVec::findByName之前的匿名命名空间中(同样是唯一使用它的地方)
虽然其中任何一个都足够了,但我更喜欢 #2,但这不是我见过的。是否有任何具体的理由支持特定选项?
【问题讨论】:
-
如果它只被一个函数使用,我暂时使用#4。事实上,您可能根本不需要仿函数(C++11 lambda 等)。如果以后发现其他用途,重构应该很简单。 - 如果我选择重构,我绝对不会使用 #3 或任何其他会强制重新编译无关代码的选项。
-
@UncleBens lambda 显然是最好的解决方案,如果它在这种情况下可用。但是 +1,因为我应该想到它,但没有。