Возможно ли в современном C ++ передавать строковый литерал в качестве параметра в шаблон C ++? - PullRequest
0 голосов
/ 05 июля 2018

Возможно ли в "современном 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() {

}

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Пока вы не получите и если у вас есть , вы можете найти следующий макрос полезным:

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

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

template<const char* str>
structe testit{
};
testit<C_STR("hello")> ti;
0 голосов
/ 05 июля 2018

Да, в .

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

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

Такие типы могут быть сконструированы из необработанных конструкторов "strings" в constexpr, в том числе с помощью направляющих вычетов , чтобы они сами автоматически изменяли размер.

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


Обратите внимание, что размещение реализации вашего шаблона в файле cpp обычно плохая идея. Но это другой вопрос.

...