Нужна карта из enum (класса) в std :: binary_function - PullRequest
3 голосов
/ 06 июня 2011

У меня есть этот enum (класс)

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

Помимо того факта, что это не 't compile:

ошибка: ожидаемое первичное выражение до токена '}'

ошибка: ожидаемое первичное выражение до токена '}'

ошибка: ожидаемый первичный-выражение перед '}' токеном

для каждой из трех строк, как мне это сделать?Я думаю, что логический_не со вторым фиктивным аргументом будет работать, как только я получу это, конечно, для компиляции ...

РЕДАКТИРОВАТЬ: Могу ли я использовать лямбда для этого?

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Вы действительно хотите std::function<bool(bool, bool)>, а не std::binary_function<bool, bool, bool>. Это существует только для typedefs и прочего в C ++ 03. Во-вторых, я бы просто использовал лямбду - они достаточно короткие и более четкие. std::logical_and и прочее существует только для создания функциональных объектов C ++ 03, и я бы использовал лямбду над ними в любой день.

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; } }
};

Подожди, какого именно оператора ты имеешь в виду? Потому что, насколько я знаю, это унарно.

2 голосов
/ 06 июня 2011

@ DeadMG ответ точен, но если вы настаиваете на использовании предопределенных функциональных объектов, вам необходимо создать экземпляр их.В данный момент вы просто передаете их имена типов.

То есть вам нужно написать std::logical_***<bool>() вместо std::logical_***<bool>.

...