我正在研究C++中的一個問題,該問題涉及大量數據的大量子集和轉換操作。爲此,我創建了一個map函數和類似列表推導。我發現了一堆,我也寫了謂詞有逆,所以我需要寫:我可以創建一個將接受函數和函數作爲參數的謂詞嗎?
和
template <typename type_t>
bool DoesntHaveTenFoo(const type_t &t) {
return t.foo < 10.0;
}
這些都不是一個真實的例子,但他們很有代表性。我還使用仿函數的一個公平的數字,如:
class HasEnoughFoo {
public:
HasEnoughFoo (double bar) { this->bar = bar; }
template<typename type_t>
bool operator()(const type_t &t) const { return t.foo >= bar; }
private:
double bar;
};
其中一些應該具有逆也。我不想不必要地重複代碼,我想編寫一個函子,它將謂詞作爲參數並返回該謂詞的(反值)。我在一個拳頭切低於:
/* -- Returns the opposite of some other predicate -------------------------- */
template<typename predicate_t>
class Not {
public:
template <typename predicate_t>
Not(predicate_t *p) { predicate = p; }
template <typename type_t>
bool operator()(const type_t &t) const {
return !(*predicate)(t);
}
private:
predicate_t *predicate;
};
我會說這就是喜歡的東西:
new_list = old_list.subset(Not<HasEnoughFoo>(&HasEnoughFoo(10.0));
或
new_list = old_list.subset(Not<HasTenFoo>(&HasTenFoo));
這似乎運作良好時predicate_t
是仿像HasEnoughFoo
,但當predicate_t
引用像HasTenFoo
這樣的常規函數時失敗。
Visual Studio抱怨說'HasTenFoo' is not a valid template type argument for parameter 'predicate_t'
。有什麼辦法可以編寫一個Not()謂詞來處理函數和函數,或者我註定要寫幾十個謂詞及其逆函數嗎?
完美 - 這正是我所尋找的。我沒有意識到,使用初始化列表將刪除默認構造函數的要求(這是我通過指針而不是按值傳遞的)。用於隱藏模板複雜性的否定功能也很漂亮。謝謝! – 2010-08-05 16:08:09