Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, Molchalnik, Вы писали:
M>>сабж.
W>Можно, конечно: пример
на безрыбье сойдёт, но хотелось бы, чтобы метод не записывал в бинарник констекспрессную переменную для StringLiteral. ZeroCost. копию названия функции хранить не надо
Re[2]: можно ли задать шаблон так, чтобы он принимал __func__ ?
Здравствуйте, watchmaker, Вы писали: W>Можно, конечно: пример
хочу уточнить: Func<"rr"> и Func<"aa"> должны быть разными типами. а то я наваял тут уже пару вариантов, но увы. они зависят не от строки, а от её длины.
Re[3]: можно ли задать шаблон так, чтобы он принимал __func__ ?
Здравствуйте, Molchalnik, Вы писали:
M>Здравствуйте, watchmaker, Вы писали: W>>Можно, конечно: пример
M>хочу уточнить: Func<"rr"> и Func<"aa"> должны быть разными типами.
В примере они и будут разными.
M>но хотелось бы, чтобы метод не записывал в бинарник констекспрессную переменную для StringLiteral. ZeroCost. копию названия функции хранить не надо
В примере она и не включается в бинарник, если ты, конечно, эту строчку не будешь явно где-то доставать обратно и использовать. (верно как минимум для clang,gcc,msvc)
Re: можно ли задать шаблон так, чтобы он принимал __func__ ?
Здравствуйте, Molchalnik, Вы писали:
M>сабж. шаблон структуры Func, чтобы он съедал и не давился всякие
M>Func<__func__> x1;
Шаблон может принять либо тип, либо скалярную величину, либо референс на объект имеющий linkage (глобально видимый символ).
Вопрос -- чем является __func__, тем более разные __func__? Тип у них есть (const char *),
но всегда одинаковый. linkage -- отсутствует.
Т.е. вроде как нельзя. А что за задача, логгер какой-то небось, или что-то вроде?
Можно сделать трюк: тип каждой лямбды -- уникален, в частности выводимый через decltype.
В итоге можно иметь синглтон инстанцирующийся для каждой строчки. Дальше он может
(но __func__ ему нужно передать макросом с самого верхнего уровня) понять к какому
именно __func__ он относится и что с этим делать. Нужно помнить, что по-стандарту
__func__ имеет block scope (т.е. потенциально в одной функции их может быть несколько)
и сравнивать их следовало бы по значению (как строки), а не по адресу...
Re[2]: можно ли задать шаблон так, чтобы он принимал __func__ ?
Здравствуйте, fk0, Вы писали:
M>>сабж. шаблон структуры Func, чтобы он съедал и не давился всякие M>>Func<__func__> x1;
fk0> Шаблон может принять либо тип, либо скалярную величину, либо референс на объект имеющий linkage (глобально видимый символ). fk0>Вопрос -- чем является __func__, тем более разные __func__? Тип у них есть (const char *), fk0>но всегда одинаковый. linkage -- отсутствует.
Нет. Согласно стандарту __func__ определяется так:
static const char __func__[] = "function-name";
И каждый день — без права на ошибку...
Re[3]: можно ли задать шаблон так, чтобы он принимал __func__ ?
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, fk0, Вы писали:
M>>>сабж. шаблон структуры Func, чтобы он съедал и не давился всякие M>>>Func<__func__> x1;
fk0>> Шаблон может принять либо тип, либо скалярную величину, либо референс на объект имеющий linkage (глобально видимый символ). fk0>>Вопрос -- чем является __func__, тем более разные __func__? Тип у них есть (const char *), fk0>>но всегда одинаковый. linkage -- отсутствует. BFE>Нет. Согласно стандарту __func__ определяется так: BFE>
2) в C++17 no_linkage начинает быть применимой к шаблону (я не понимаю почему, прошу носом ткнуть в стандарт);
3) __func__ нигде не прокатывает, от gcc получено: error: '"main"' is not a valid template argument of type 'const char (&)[5]' because '"main"' is not a variable
11 | (void)S<__func__>{};"
На stackoverflow пишут:
In the current working draft, N4431, the constraints on non-type template arguments have been relaxed. [14.3.2p1] now says:
A template-argument for a non-type template-parameter shall be a converted constant expression (5.20) of the type of the template-parameter. For a non-type template-parameter of reference or pointer type, the value of the constant expression shall not refer to (or for a pointer type, shall not be the address of):
a subobject (1.8),
a temporary object (12.2),
a string literal (2.13.5),
the result of a typeid expression (5.2.8), or a predefined __func__ variable (8.4.1).