Не могу определить строковый литерал в аргументах шаблона - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь определить новый строковый литерал в аргументах шаблона функции.

template<const char* msg>
const char* function()
{
    return msg;
}
int main()
{
    function<"why doesnt this work?">()
    return 0;
}

Однако это не работает.Я должен сделать что-то вроде этого

constexpr char msg[] = "this is ugly and annoying";
int main()
{
    function<msg>()
    return 0;
}

Это крайне неудобно.Я пытаюсь создать printf-подобную функцию, но это серьезное препятствие.Если я перейду к фиктивной строке (например, tuple('a','b','c'...), то это сделает интерфейс для расширения пользовательских форматов более сложным и уродливым, а также код в целом.(% d%,% f%,% e% являются форматами по умолчанию,% myformat% - это пользовательский пример. Они могут быть сколько угодно долго из-за% terminator)

Как я могу получитьмой торт и съесть его тоже (или хотя бы как можно ближе к нему)?

1 Ответ

0 голосов
/ 01 октября 2018

Это не разрешено стандартом C ++, потому что у компиляторов возникли проблемы с тем, как именно будут работать правила «сворачивания» идентичных строк.

В мыу вас будут руководства по выводам и нетипизированные аргументы шаблона типа, предоставленного пользователем.Вместо char const* вы возьмете ct_string, инициализированный "some string", который будет содержать строковые данные, и используйте <=> для определения уникальности.

До тех пор, пока вам не повезет.

Обратите внимание, что вы получаете отдельный function<msg>() для каждого используемого буфера msg, а не для каждого строкового значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...