【问题标题】:Need a map from enum (class) to std::binary_function需要从枚举(类)到 std::binary_function 的映射
【发布时间】:2011-06-06 14:29:53
【问题描述】:

我有这个枚举(类)

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 吗?

【问题讨论】:

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


    【解决方案1】:

    你真的想要std::function&lt;bool(bool, bool)&gt;,而不是std::binary_function&lt;bool, bool, bool&gt;。这只存在于 C++03 中的 typedef 和东西。其次,我只使用 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; } }
    };
    

    等等——你指的是哪个运算符?因为这是一元的,据我所知。

    【讨论】:

    • 是的,我知道,但我希望它在这张地图中统一,所以我不必去寻找其他东西,也许[](bool a, bool) { return !a; }?像logical_and 和logical_or 这样的现有模板不会“更好”吗,因为首先,我没有编写它们(即,当它提供您需要的内容时使用该库)。当然not_op 会成为一个问题。 (另请注意your code is ill-formed)
    • @rubenvb:你的也是——我从你的例子中复制了它。比起那种函数对象,我更喜欢 lambda,因为代码是内联的,如果你问我更容易更改。
    • 应该是std::function&lt;bool(bool,bool)&gt; 而不是std::function&lt;bool,bool,bool&gt;?
    • @rubenvb:是的,应该是。教我复制粘贴代码,不看全:P
    【解决方案2】:

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

    也就是说,你需要写std::logical_***&lt;bool&gt;() 而不仅仅是std::logical_***&lt;bool&gt;。

    【讨论】:

    • 哦,whaddayaknow,lambda 的另一个专业人士。我开始越来越欣赏 lambda 了:)
    • @rubenvb:如果将它们定义为模板函数而不是模板类,则您使用的语法将起作用。
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多