需要从枚举(类)到std :: binary_function的映射

时间:2011-06-06 14:29:54

标签: c++ map c++11 functional-programming

我有这个枚举(类)

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 :(

除了这不编译之外:

  

错误:在'}'标记

之前预期的主要表达式      

错误:在'}'标记

之前预期的主要表达式      

错误:在'}'标记

之前预期的主要表达式

对于这三行中的每一行,我该怎么做?我认为一个带有第二个伪参数的logical_not会起作用,一旦我将其编译为当然......

编辑:我可以使用lambda吗?

2 个答案:

答案 0 :(得分:3)

你真的想要std::function<bool(bool, bool)>,而不是std::binary_function<bool, bool, bool>。这只适用于C ++ 03中的typedef和stuff。其次,我只是使用一个lambda-它们足够短而且更清晰。 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; } }
};

等等 - 您指的是哪个运营商?因为据我所知,这是一元的。

答案 1 :(得分:2)

@ DeadMG的答案是现场的,但如果你坚持使用预定义的函数对象,你需要实例化它们。目前你只是传递他们的类型名称。

也就是说,您需要编写std::logical_***<bool>()而不是std::logical_***<bool>