Как здесь с порядком инициализации?
От: Alexey F  
Дата: 20.08.09 12:08
Оценка:
В соседнем топике
Автор: steep8
Дата: 15.08.09
обсуждали объявление строковых констант как char const* const против std::string const. В качестве аргумента к char const* const приводилось сложность инициализации std::string const перед использованием (из-за неопределённого порядка инициализации). А против char const* const выдвигались аргументы о неудобстве, например, конкатенации строк.
Приведённый ниже класс, случайно, не избавлен от этих недостатков (спрашиваю, потому что не уверен, как с порядком инициализации при инициализации POD-структур так, как показано ниже)?

namespace Tools {
    template< class CharType, class Traits = std::char_traits<CharType>, class Allocator = std::allocator<CharType> >
    struct basic_string_const {
        // Для того, чтобы basic_string_const остался POD, конструкторы и т.п. не определяем.

        // Открытый член, чтобы можно было инициализировать как агрегат.
        CharType const* body;


        // Неявное приведение:
        operator CharType const* () const {
            return body;
        }


        // Явные приведения:
        CharType const* c_str () const {
            return body;
        }


        // А можно и substr, find и прочие - по вкусу...
        std::basic_string<CharType, Traits, Allocator> str () const {
            return std::basic_string<CharType, Traits, Allocator> ( body );
        }
    };


    template<class CharType, class Traits, class Allocator, class T>
    std::basic_string<CharType, Traits, Allocator> operator+ (
        basic_string_const<CharType, Traits, Allocator> const& first,
        T const& second
    ) {
        return first.str () + second;
    }


    template<class CharType, class Traits, class Allocator, class T>
    std::basic_string<CharType, Traits, Allocator> operator+ (
        T const& first,
        basic_string_const<CharType, Traits, Allocator> const& second
    ) {
        return first + second.str ();
    }


    typedef basic_string_const<char> string_const;
    typedef basic_string_const<wchar_t> wstring_const;
}


И пример использования:
Tools::string_const some = { "C:\\MyDoc" };
// ...
std::string result = some + '\\' + "SomeFile.png";
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.