Передача строкового литерала в качестве параметра в шаблонный класс C ++ - PullRequest
37 голосов
/ 09 января 2010

Я хочу класс, который принимает два параметра в своем конструкторе.Первый может быть либо int, double, либо float, поэтому <typename T>, а второй всегда является строковым литералом «моя строка», поэтому я предполагаю const char * const.

Может кто-нибудь дать мне какой-нибудь скомпилированный кодкоторый объявляет простой шаблон класса, как описано, и объявляет объект этого класса?

Спасибо

Ответы [ 12 ]

1 голос
/ 10 августа 2018

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

#include <utility>

template <char ... Chars>
struct type_string_t {
    static constexpr const char data[sizeof... (Chars)] = {Chars...};
};

template <char s(std::size_t), std::size_t... I>
auto type_string_impl(std::index_sequence<I...>) {return type_string_t<s(I)...>();};

#define type_string(s) decltype (type_string_impl<[](std::size_t i) {return s[i];}> \
(std::make_index_sequence<sizeof (s)>()))

static_assert (std::is_same<type_string("String_A"),
                            type_string("String_A")>::value);
static_assert (!std::is_same<type_string("String_A"),
                             type_string("String_B")>::value);
0 голосов
/ 17 января 2019

Может быть, не то, что запрашивает OP, но если вы используете boost, вы можете создать такой макрос, например:

#define C_STR(str_) boost::mpl::c_str< BOOST_METAPARSE_STRING(str_) >::value

Затем используйте следующее:

template<const char* str>
structe testit{
};
testit<C_STR("hello")> ti;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...