Используйте строковые литералы внутри шаблона, который обрабатывает любые размеры символов - PullRequest
0 голосов
/ 20 сентября 2018

Давайте рассмотрим этот тип шаблона:

template<typename CharT>
std::basic_string<CharT> refEnvVaraiable(const std::basic_string<CharT> &varaibleName)
{
    std::basic_string<CharT> result;
    result.reserve(varaibleName.length() + 3);
    result = "${" + varaibleName + "}";
    return result;
}

План состоит в том, что это предполагает обработку строк с любым размером символов.Это, конечно, не скомпилируется, если аргумент функции аргумента равен std::wstring, так как нет оператора для конкатенации его со строковым литералом типа const char[].

Как заставить строковый литерал соответствовать требуемому типу символа?Нужно ли предоставлять специализацию для констант, представляющих литералы (это много кода для котельной пластины)?Или есть готовый инструмент для этого?

Живой образец

1 Ответ

0 голосов
/ 20 сентября 2018

Одна вещь, которую вы можете сделать, это использовать if constexpr для кодирования различных объединений, которые вы хотите поддерживать.Когда код скомпилирован, будет скомпилирована только действительная конкатенация, а остальные будут отброшены.Это даст вам что-то вроде

template<typename CharT>
std::basic_string<CharT> refEnvVaraiable(const std::basic_string<CharT> &varaibleName)
{
    std::basic_string<CharT> result;
    result.reserve(varaibleName.length() + 3);
    if constexpr (std::is_same_v<CharT, char>) result = "${" + varaibleName + "}";
    else if constexpr (std::is_same_v<CharT, wchar_t>) result = L"${" + varaibleName + L"}";
    else if constexpr (std::is_same_v<CharT, char16_t>) result = u"${" + varaibleName + u"}";
    else if constexpr (std::is_same_v<CharT, char32_t>) result = U"${" + varaibleName + U"}";
    else static_assert(false, "refEnvVaraiable called with unsupported character type");
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...