Возможно ли в современных 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

Да, в .

Проблема заключалась в том, что определить уникальность аргумента нетипичного шаблона было сложно.

добавляет <=> сравнение оператора космического корабля. Если он не предоставлен пользователем (и основан только на том, что предоставлен не пользователем <=>, а затем повторяется рекурсивно) (и некоторые другие требования; см. P0732), тип можно использовать в качестве аргумента шаблона нетипичного типа.

Такие типы могут быть сконструированы из необработанных "strings" в конструкторах constexpr, в том числе с помощью направляющих дедукции , чтобы они сами автоматически 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;