2016-06-04 15 views
-1

Для различных (связанных с C++ 11 std :: string-change) причин я хотел бы использовать строку non-std :: string в некоторых местах моего 11-иго кода C++, который должен быть согласен с несколькими версиями нескольких компиляторов C++.Портативный, std :: string-подобный строковый класс, который не является std :: string

Теперь я не против, работают ли мои строки в режиме pre-C++ 11 или post-C++ 11; и я не забочусь о производительности. Я просто хочу хороший надежный класс строк, который ни при каких обстоятельствах не дает мне ошибок, связанных с std::__cxx11::string и другими такими вуду.

Какие у меня варианты? Могу ли я/должен ли я реплицировать реализацию одного компилятора в свои собственные файлы заголовков? Является ли опция vstring в GCC? Что-то другое?

+0

Что квалифицируется как «строка-как»? Вы говорите, что вас не волнуют различия - часть причины, по которой C++ 11 внес изменения, заключается в том, что новая версия намного более потокобезопасна. Можете ли вы уточнить, что именно вы конкретно хотите? Вы просто хотите, чтобы он был конвертируемым в оба типа строк? Почему вы не можете просто конвертировать между двумя типами в любых границах, подходящих в вашем проекте, зачем вам нужен третий тип строки. Почему вы не можете просто перекомпилировать весь код и связанные библиотеки на C++ 11 с использованием нового типа строк и забыть весь беспорядок. –

+0

@ChrisBeck: Предположим, что он реализует методы 'std :: string'. Или, если бы я хотел быть более скромным, можно использовать в качестве ключа карты и иметь равноценность '.c_str()'. Защита резьбы не обязательна. – einpoklum

+0

Я думаю, что все возможности, о которых вы говорите, - это варианты? Вопрос не содержит достаточно информации, чтобы исключить любой из них afaict. Вы могли бы сыграть свою роль, которая может использоваться в качестве ключа карты и имеет '.c_str()' через 5 минут или меньше. –

ответ

0
template<class T> 
struct crappy_string { 
    mutable std::vector<T> buffer; 
    T const* c_str() const { 
    if (buffer.empty() || buffer.back()) 
     buffer.push_back(0); 
    return buffer.data(); 
    } 
    friend bool operator<(crappy_string const& lhs, crappy_string const& rhs) { 
    lhs.c_str(); rhs.c_str(); // ensure null terminator in both 
    return lhs.buffer < rhs.buffer; 
    }  
}; 

Это удовлетворяет минимальным требованиям, которые вы указали в комментариях.

+0

Это будет работать только для упорядоченных карт. Но точка взята. Думаю, я не должен был отказываться от всех этих методов в комментариях, это было нехорошо торговаться :-( – einpoklum