2011-06-06 58 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