Возможно ли в современных C++ передать строковый литерал в качестве параметра шаблону C++?
Возможно ли в "современном C++" (C++ 17 или выше) передать строковый литерал в качестве параметра шаблону C++?
Я понимаю, что вы можете сделать это с аргументом конструктора; Я просто подумал, что было бы удобнее иметь его как аргумент шаблона, а не глубоко погружать в файл cpp. Мне было любопытно, возможно, это была новая особенность современного C++. См. Псевдо-код ниже того, что я пытаюсь сделать:
Псевдокод Пример:
// Header File /////////////////////////
template<constexpr string Name>
class ModuleBase {
public:
ModuleBase();
string name;
};
class xyz : ModuleBase<"xyz"> {
public:
xyz();
};
// Cpp File //////////////////////////
template<string_literal Name>
ModuleBase<Name>::ModuleBase() {
name = Name;
}
xyz::xyz() : ModuleBase() {
}
Ответы
Ответ 1
Да, в c++20.
Проблема заключалась в том, что определить уникальность аргумента нетипичного шаблона было сложно.
c++20 добавляет <=>
сравнение оператора космического корабля. Если он не предоставлен пользователем (и основан только на том, что предоставлен не пользователем <=>
, а затем повторяется рекурсивно) (и некоторые другие требования; см. P0732), тип можно использовать в качестве аргумента шаблона нетипичного типа.
Такие типы могут быть сконструированы из необработанных "strings"
в конструкторах constexpr
, в том числе с помощью направляющих дедукции c++17, чтобы они сами автоматически constexpr
размер.
Поскольку размер хранимых данных, вероятно, будет частью типа, вы должны принять тип в качестве auto
типизированного нетипового параметра или иного автоматически выводимого типа.
Обратите внимание, что размещение реализации вашего шаблона в файле cpp обычно плохая идея. Но это другой вопрос.
Ответ 2
Пока вы не получите c++20
и если у вас есть 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;