![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
The Default Constructible Type RequirementBoost , Chapter 1. Boost.Convert 2.0 , boost::cnv::stream Converter
|
![]() | Note |
---|---|
По умолчанию< |
Тем не менее, хорошо продуманный тип (на мой взгляд, в любом случае) должен иметь только значимые и однозначные конструкторы ... и конструктор по умолчанию не всегда и не обязательно один из них. Рассмотрим в качестве одного из таких примеров следующее:
struct direction { // Note: the class does NOT have the default constructor. enum value_type { up, dn }; direction(value_type value) : value_(value) {} bool operator==(direction that) const { return value_ == that.value_; } value_type value() const { return value_; } private: value_type value_; };
std::istream& operator>>(std::istream& stream, direction& dir) { std::string str; stream >> str; /**/ if (str == "up") dir = direction::up; else if (str == "dn") dir = direction::dn; else stream.setstate(std::ios_base::failbit); return stream; } std::ostream& operator<<(std::ostream& stream, direction const& dir) { return stream << (dir.value() == direction::up ? "up" : "dn"); }
<direction
>не имеет состояния дефолта. Это неПо умолчанию Конструктивнои, следовательно, следующее не составляет:
direction dir1 = convert<direction>(str, cnv).value(); // Does not compile direction dir2 = lexical_cast<direction>(str); // Does not compile
ОднакоBoost.Convertспособен обрабатывать такой тип с небольшой помощью пользователя — инструкциио том, каксоздать упомянутое временное хранилище:
namespace boost { template<> inline direction make_default<direction>() { return direction(direction::up); } }
Теперь такой класс можно развернуть<boost::cnv::cstream
>:
direction dir1 = convert<direction>(str, cnv).value(); // Compiles direction dir2 = lexical_cast<direction>(str); // Does not compile
Статья The Default Constructible Type Requirement раздела Chapter 1. Boost.Convert 2.0 boost::cnv::stream Converter может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: boost::cnv::stream Converter ::
реклама |