Как инициализировать неизвестный строковый тип? - PullRequest
1 голос
/ 04 августа 2020

Допустим, у меня есть такой класс

template<typename CharT>
class basic_class
{
  public:
    using char_type   = CharT;
    using string_type = std::basic_string<CharT>;
  private:
    const char_type   ch = '?';
    const string_type str{"How to init"};
};

Это нормально, если это char, но не для wchar_t.

  1. Как я могу это сделать?

EDIT:

Я решил написать функцию, которая преобразует форму char и строку в различные типы, например

template<typename To>
constexpr To to_type(char val)
{}

template<>
constexpr char     to_type<char>(char val)
{
   return val;
}

template<>
constexpr wchar_t  to_type<wchar_t>(char val)
{
   //....
}

template<>
constexpr char16_t to_type<char16_t>(char val)
{
   //....
}

template<>
constexpr char32_t to_type<char32_t>(char val)
{
   //....
}

и

template<typename To>
constexpr To             to_type(std::string val)
{}

template<>
constexpr std::string    to_type<std::string>(std::string val)
{
   return val;
}

template<>
constexpr std::wstring   to_type<std::wstring>(std::string val)
{
   //....
}

template<>
constexpr std::u16string to_type<std::u16string>(std::string val)
{
   //....
}

template<>
constexpr std::u32string to_type<std::u32string>(std::string val)
{
   //....
}

Тогда я буду использовать это как

template<typename CharT>
class basic_class
{
  public:
    using char_type   = CharT;
    using string_type = std::basic_string<CharT>;
  private:
    const char_type   ch = to_type<char_type>( '?' );
    const string_type str{ to_type<string_type>( "How to init" ) };
};

В операторах if, например

if ( ch  == to_type<char_type>('?') )
{
  //....
}

if ( str == to_type<string_type>("How to init") )
{
  //....
}
Как преобразовать другие типы char и std :: string?

Все предложения приветствуются, заранее спасибо.

1 Ответ

0 голосов
/ 04 августа 2020

Вы можете определить функцию, которая возвращает значение правильного типа:

template<typename CharT>
class basic_class
{
  public:
    using char_type   = CharT;
    using string_type = std::basic_string<CharT>;
  private:
    constexpr auto getInitString() {
        if constexpr (is_same<CharT, wchar_t>::value) {
            return L"How to init";
        }
        else {
            return "How to init";
        }
    }

    const char_type   ch = '?';
    const string_type str{getInitString()};
};

Это будет работать на C ++ 17, в более ранних версиях это немного сложнее.

Другой способ скопировать с чего-то:

std::string_view initString = "How to init"sv;

template<typename CharT>
class basic_class
{
  public:
    using char_type   = CharT;
    using string_type = std::basic_string<CharT>;
  private:
    const char_type   ch = '?';
    const string_type str{initString.begin(), initString.end()};
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...