Здравствуйте, MTD, Вы писали:
MTD>Чтобы работал lexical_cast так:
MTD>std::istream& operator>>(std::istream& stream, my_enum& value)
А в чем отличие от такое кода и что лучше?
namespace boost{
template <>
inline my_enum lexical_cast< my_enum, std::string >( const std::string& arg )
{
my_enum result;
if (arg == "one") result = one;
else if (arg == "two") result = two;
else if (arg == "three") result = three;
else throw std::runtime_error( "..." );
return result;
}
}// namespace boost
Здравствуйте, Igore, Вы писали:
I>А в чем отличие от такое кода и что лучше?
Главное отличие — это не lexical_cast и соответсвенно поведение может отличаться. Что лучше? Ну твой вариант однозначно быстрее. Лично я бы не стал мудрить и просто написал бы рядом с объявлением me_enum функцию to_string(my_enum).
Здравствуйте, MTD, Вы писали:
I>>А в чем отличие от такое кода и что лучше? MTD>Главное отличие — это не lexical_cast и соответсвенно поведение может отличаться.
В смысле? Это просто специализация для my_enum, и вызывать нужно будет так же, boost::lexical_cast, исключение кидать только надо через boost::conversion::detail::throw_bad_cast чтобы 1:1 было и все.
Здравствуйте, Igore, Вы писали:
MTD>>Главное отличие — это не lexical_cast и соответсвенно поведение может отличаться. I>В смысле? Это просто специализация для my_enum
Именно. Вместо бустовой реализации ты предлагаешь свою, в этом и есть отличие.
I>исключение кидать только надо через boost::conversion::detail::throw_bad_cast чтобы 1:1 было и все.
Это детали реализации, которые могут меняться и ты как пользователь знать не должен.
У битового поля может быть сразу взведено несколько флагов. Например f0 | f1 — что выведет ваш оператор <<? И таких енумов полно в SDK, например. Я просто имею свою самописную обёртку и активно ею пользуюсь. Но меня не удовлетворяет то, что максимальное количество элементов, с которыми она справляется, несколько десятков. У вас, кстати, какое максимальное количество?
Здравствуйте, niXman, Вы писали:
X>не понимаю... если ваш E может быть лишь в одном из трех значений(f0/f1/f2), то зачем все эти ухищрения с битовыми операциями внутри оператора вывода?
Здравствуйте, niXman, Вы писали:
X>результатом этой операции будет интегральный тип, а не E.
все еще больше осложняется тем, что побитовые операции не применимы к enum class`ам.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[11]: boost::lexical_cast: из std::string в enum
Я для битовых полей я определяю битовые операции так, что они возвращают енум. Это удобно.
X>Здравствуйте, niXman, Вы писали:
X>>результатом этой операции будет интегральный тип, а не E. X>все еще больше осложняется тем, что побитовые операции не применимы к enum class`ам.