Меня интересуют соглашения и лучшие практики, касающиеся упаковки функторов предикатов. Например, учитывая класс как:
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, но я никогда не видел, чтобы это было сделано. Есть ли конкретные причины, благоприятствующие тому или иному варианту?