В
соседнем топикеАвтор: 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";