Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

The Default Constructible Type Requirement

Boost , Chapter 1. Boost.Convert 2.0 , boost::cnv::stream Converter

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Из-за<std::stream>конструкции требуетсяинициализированноевременное хранениетипа TypeOut, чтобы поместить результат запрашиваемого преобразования в. Концептуально<boost::cnv::cstream>достигает этого:

istream_type& istream = stream_;
TypeOut        result = boost::make_default<TypeOut>();
istream >> result;

Временный склад<result>инициализируется с<boost::make_default()>по умолчанию реализацией которого является

namespace boost
{
   template<typename T> T make_default() { return T(); }
}

Следовательно,

[Note]Note

По умолчанию<boost::cnv::cstream>и<boost::cnv::wstream>преобразователи требуют.TypeOutTypeOutDefault Constructible.

Тем не менее, хорошо продуманный тип (на мой взгляд, в любом случае) должен иметь только значимые и однозначные конструкторы ... и конструктор по умолчанию не всегда и не обязательно один из них. Рассмотрим в качестве одного из таких примеров следующее:

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

PrevUpHomeNext

Статья The Default Constructible Type Requirement раздела Chapter 1. Boost.Convert 2.0 boost::cnv::stream Converter может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: boost::cnv::stream Converter ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 03:13:48/0.0056140422821045/1