Я хотел бы написать функцию, которая будет выглядеть примерно так:строковый литерал - преобразование шаблона между типами полукокса
template <typename CharT>
std::basic_string<CharT> convert(char const *);
и использоваться следующим образом:
convert<char>("Hello World!"); // "Hello World!"
convert<wchar_t>("Hello World!"); // L"Hello World!"
convert<char16_t>("Hello World!"); // u"Hello World!"
convert<char32_t>("Hello World!"); // U"Hello World!"
я мог бы использовать std::codecvt
и Ко, но я считаю это почти бессмысленным, так как было бы проще использовать макрос, который добавляет L
, u
или U
с 0 стоимостью.
К сожалению, шаблоны и макросы не действуют на одном уровне ... Итак, вот мой вопрос: будет ли какой-то способ mix им? Или есть лучший способ?
Моя основная цель - избежать повторения (специализации) кода: некоторые функции, которые я кодирую, - это CharT
шаблоны и использовать строковые литералы, и это будет единственной разницей. В качестве примера:
template <typename CharT>
void foo (std::vector<std::basic_string<CharT>> const & vec,
std::basic_string<CharT> str = convert<CharT>("default"));
Это позволит избежать специализации foo() для каждого типа символов.
Большое спасибо за вашу помощь
Я не вижу необходимости в специализации здесь, просто используйте, например. 'codecvt' с' char' в качестве типа «источник» и 'CharT' как тип« destination »? –
Действительно, я уже думал об этом позже. Отредактировано, спасибо. –
@JoachimPileborg Да, но это все еще расчет времени исполнения. OP хочет избежать этого, поскольку они являются строковыми литералами, и добавление определенного префикса будет делать трюк. – edmz