我想知道关于谓词函子包装的约定和最佳实践。例如,给定的一类,如:包装谓词函子
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::TimerNameIs
) - 内TimerVec(目前唯一的用户)
- 嵌套在提前为
TimerVec::findByName
实施(再次仅它使用的地方)的匿名命名空间
虽然任何这些会我相当喜欢#2,但这不是我见过的。有没有具体的理由支持特定的选择?
如果它只被一个函数使用,我会暂时使用#4。事实上,你可能根本不需要函子(C++ 11 lambda等)。如果您稍后发现其他用途,则重构应该很简单。 - 如果我选择重构,我绝对不会使用#3或任何其他强制无关代码重新编译的选项。 – UncleBens
@UncleBens在这种情况下,lambda显然是最好的解决方案。但+1,因为我应该想到它,但没有。 – rlduffy