можно ли задать шаблон так, чтобы он принимал __func__ ?
От: Molchalnik  
Дата: 05.10.21 07:22
Оценка:
сабж. шаблон структуры Func, чтобы он съедал и не давился всякие

Func<__func__> x1;
Func<__PRETTY_FUNCTION__> x2;
Func<__FUNCTION__> x3;
Re: можно ли задать шаблон так, чтобы он принимал __func__ ?
От: watchmaker  
Дата: 05.10.21 08:43
Оценка: +1
Здравствуйте, Molchalnik, Вы писали:

M>сабж.


Можно, конечно: пример
Re[2]: можно ли задать шаблон так, чтобы он принимал __func__ ?
От: Molchalnik  
Дата: 05.10.21 09:24
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, Molchalnik, Вы писали:


M>>сабж.


W>Можно, конечно: пример


на безрыбье сойдёт, но хотелось бы, чтобы метод не записывал в бинарник констекспрессную переменную для StringLiteral. ZeroCost. копию названия функции хранить не надо
Re[2]: можно ли задать шаблон так, чтобы он принимал __func__ ?
От: Molchalnik  
Дата: 05.10.21 09:45
Оценка:
Здравствуйте, watchmaker, Вы писали:
W>Можно, конечно: пример

хочу уточнить: Func<"rr"> и Func<"aa"> должны быть разными типами. а то я наваял тут уже пару вариантов, но увы. они зависят не от строки, а от её длины.
Re[3]: можно ли задать шаблон так, чтобы он принимал __func__ ?
От: watchmaker  
Дата: 05.10.21 10:13
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Здравствуйте, watchmaker, Вы писали:

W>>Можно, конечно: пример

M>хочу уточнить: Func<"rr"> и Func<"aa"> должны быть разными типами.


В примере они и будут разными.

M>но хотелось бы, чтобы метод не записывал в бинарник констекспрессную переменную для StringLiteral. ZeroCost. копию названия функции хранить не надо


В примере она и не включается в бинарник, если ты, конечно, эту строчку не будешь явно где-то доставать обратно и использовать. (верно как минимум для clang,gcc,msvc)
Re: можно ли задать шаблон так, чтобы он принимал __func__ ?
От: fk0 Россия  
Дата: 17.10.21 11:42
Оценка: -1
Здравствуйте, Molchalnik, Вы писали:

M>сабж. шаблон структуры Func, чтобы он съедал и не давился всякие


M>Func<__func__> x1;


Шаблон может принять либо тип, либо скалярную величину, либо референс на объект имеющий linkage (глобально видимый символ).
Вопрос -- чем является __func__, тем более разные __func__? Тип у них есть (const char *),
но всегда одинаковый. linkage -- отсутствует.

Т.е. вроде как нельзя. А что за задача, логгер какой-то небось, или что-то вроде?
Можно сделать трюк: тип каждой лямбды -- уникален, в частности выводимый через decltype.
В итоге можно иметь синглтон инстанцирующийся для каждой строчки. Дальше он может
(но __func__ ему нужно передать макросом с самого верхнего уровня) понять к какому
именно __func__ он относится и что с этим делать. Нужно помнить, что по-стандарту
__func__ имеет block scope (т.е. потенциально в одной функции их может быть несколько)
и сравнивать их следовало бы по значению (как строки), а не по адресу...
Re[2]: можно ли задать шаблон так, чтобы он принимал __func__ ?
От: B0FEE664  
Дата: 18.10.21 07:56
Оценка:
Здравствуйте, 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__ ?
От: fk0 Россия  
Дата: 18.10.21 20:13
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, fk0, Вы писали:


M>>>сабж. шаблон структуры Func, чтобы он съедал и не давился всякие

M>>>Func<__func__> x1;

fk0>> Шаблон может принять либо тип, либо скалярную величину, либо референс на объект имеющий linkage (глобально видимый символ).

fk0>>Вопрос -- чем является __func__, тем более разные __func__? Тип у них есть (const char *),
fk0>>но всегда одинаковый. linkage -- отсутствует.
BFE>Нет. Согласно стандарту __func__ определяется так:
BFE>
BFE>static const char __func__[] = "function-name";
BFE>


Ха! Смотри: http://coliru.stacked-crooked.com/a/bfca89f76c0deb26

1) в C++ < C++17 как я и говорю;

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).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.