我想知道關於謂詞函子包裝的約定和最佳實踐。例如,給定的一類,如:包裝謂詞函子
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