2011-06-06 22 views
3

我有這個枚舉(類)需要從枚舉(類)映射到std :: binary_function

enum class conditional_operator 
{ 
    plus_op, 
    or_op, 
    not_op 
} 

而且我想一個std::map表示這些映射:

std::map<conditional_operator, std::binary_function<bool,bool,bool>> conditional_map = 
     { { conditional_operator::plus_op, std::logical_and<bool> }, 
      { conditional_operator::or_op, std::logical_or<bool>}, 
      { conditional_operator::not_op, std::binary_negate<bool>} // this seems fishy too, binary_negate is not really what I want :(

除了從這個不編譯的事實:

error: expected primary-expression before '}' token

error: expected primary-expression before '}' token

error: expected primary-expression before '}' token

對於這三行中的每一行,我該怎麼做?我認爲logical_not與第二個虛擬參數將工作,一旦我得到這個編譯當然...

編輯:我可以使用lambda的這個?

回答

3

你真的想要std::function<bool(bool, bool)>,而不是std::binary_function<bool, bool, bool>。這隻適用於C++ 03中的typedefs和東西。其次,我只是使用拉姆達 - 他們足夠短,更清晰。 std::logical_and和東西只存在C++ 03函數對象的創建,我會在任何一天使用lambda。

std::map<conditional_operator, std::function<bool(bool,bool)>> conditional_map = 
{ 
    { conditional_operator::plus_op, [](bool a, bool b) { return a && b; } }, 
    { conditional_operator::or_op, [](bool a, bool b) { return a || b; } }, 
    { conditional_operator::not_op, [](bool a, bool b) { return !a; } } 
}; 

等等 - 你指的是什麼確切的算子而不是?因爲這是一元的,據我所知。

+0

也許'!(a && b)'? :| – Xeo 2011-06-06 14:40:27

+0

是的,我知道,但我希望它在這張地圖中統一,所以我不必去尋找別的東西,也許'[](bool a,bool){return!a; }'?並且不會像「logical_and」和「logical_or」這樣的現有模板是「更好」的,因爲我沒有寫它們(例如,當它提供你需要的時候使用它)。當然'not_op'會成爲一個問題。 (還要注意[你的代碼不合格](http://stackoverflow.com/questions/6253351/cant-use-not-or-or-or-plus-as-identifier)) – rubenvb 2011-06-06 14:40:31

+0

@rubenvb:那麼你的 - 我從你的例子中複製它。我贊成在這種函數對象上使用lambda,因爲如果你問我,代碼是內聯的並且更容易改變。 – Puppy 2011-06-06 14:48:05

2

@ DeadMG的答案是點亮的,但是如果你堅持使用預定義的函數對象,你需要實例化它們的。目前你只是傳遞他們的類型名稱。

也就是說,您需要編寫std::logical_***<bool>()而不僅僅是std::logical_***<bool>

+0

哦,whaddayaknow,另一個贊成lambda的。我開始欣賞lambda的越來越多:) – rubenvb 2011-06-06 14:56:35

+0

@rubenvb:如果你使用的語法被定義爲模板函數而不是模板類,那麼它的工作方式就會起作用。 – 2011-06-06 15:04:04