Re: имя переменной в компайл-тайм
От: rg45 СССР  
Дата: 10.03.18 22:38
Оценка: :))) :))) :))
Здравствуйте, niXman, Вы писали:

X>привет!

X>подскажите, плиз, планируется ли сабж в каком-то из будущих стандартов?
X>спасибо.

А теперь внимательно следим за руками, слабонервным зажмуриться:

https://ideone.com/erQjVI

#include <iostream>
#include <regex>

template <typename T, T& var>
std::string get_variable_name() {
  std::string str(__PRETTY_FUNCTION__);
  std::smatch match;
  std::regex pattern("T& var = (\\w+)");
  std::regex_search(str, match, pattern);
  return match[1];
}

char char_1;
int int_2;
double double_3;
float float_4;
std::string string_5;

int main()
{
   std::cout << get_variable_name<decltype(char_1), char_1>() << std::endl;
   std::cout << get_variable_name<decltype(int_2), int_2>() << std::endl;
   std::cout << get_variable_name<decltype(double_3), double_3>() << std::endl;
   std::cout << get_variable_name<decltype(float_4), float_4>() << std::endl;
   std::cout << get_variable_name<decltype(string_5), string_5>() << std::endl;
}


Output:
char_1
int_2
double_3
float_4
string_5


Кто после этого скажет, что в C++ нет рефлексии?
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: имя переменной в компайл-тайм
От: watchmaker  
Дата: 09.03.18 13:32
Оценка: +1 :)
Здравствуйте, niXman, Вы писали:

X>
X>int var;
X>constexpr const char *varname = get_var_name(var);
X>


Так и сейчас можно
#define get_var_name(var) #var

Re[2]: имя переменной в компайл-тайм
От: night beast СССР  
Дата: 10.03.18 23:27
Оценка: +1 :)
Здравствуйте, rg45, Вы писали:

X>>привет!

X>>подскажите, плиз, планируется ли сабж в каком-то из будущих стандартов?
X>>спасибо.

R>А теперь внимательно следим за руками, слабонервным зажмуриться:


R>https://ideone.com/erQjVI


R>
R>char char_1;
R>int int_2;
R>double double_3;
R>float float_4;
R>std::string string_5;


R>Кто после этого скажет, что в C++ нет рефлексии?


а если это внутрь main поместить?
Re[4]: имя переменной в компайл-тайм
От: YuriV  
Дата: 12.03.18 17:16
Оценка: 9 (1)
Здравствуйте, rg45, Вы писали:

На основе __PRETTY_FUNCTION__ целый CTTI написан:
Re[5]: имя переменной в компайл-тайм
От: watchmaker  
Дата: 09.03.18 13:41
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>так это я знаю, потому и спрашиваю про стандарт


Так это уже есть в стандарте.
Что ещё планировать? Что тебе хочется?

Конечно в будущем запланировано добавить в c++ лучшую поддержку рефлексии. Но вот конкретно эта часть уже доступна и стандартизированна давным-давно.
Re[3]: имя переменной в компайл-тайм
От: rg45 СССР  
Дата: 11.03.18 08:58
Оценка: :)
Здравствуйте, night beast, Вы писали:

R>>
R>>char char_1;
R>>int int_2;
R>>double double_3;
R>>float float_4;
R>>std::string string_5;
NB>


NB>а если это внутрь main поместить?


Легко: https://ideone.com/RsSisx



--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 11.03.2018 9:01 rg45 . Предыдущая версия . Еще …
Отредактировано 11.03.2018 9:00 rg45 . Предыдущая версия .
Re[3]: имя переменной в компайл-тайм
От: rg45 СССР  
Дата: 14.03.18 12:26
Оценка: :)
Здравствуйте, Ops, Вы писали:

Ops>А давно в C++ есть __PRETTY_FUNCTION__ ? Я что-то пропустил?


Что-то мне подсказывает, что ответ на свой вопрос ты знаешь и сам Не стоит воспринимать этот стеб на полном серьезе.
--
Справедливость выше закона. А человечность выше справедливости.
имя переменной в компайл-тайм
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.03.18 12:30
Оценка:
привет!

подскажите, плиз, планируется ли сабж в каком-то из будущих стандартов?

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: имя переменной в компайл-тайм
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.03.18 13:13
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


И наше вам


X>подскажите, плиз, планируется ли сабж в каком-то из будущих стандартов?


Ну, как бы имя переменной и сейчас в компайл-тайм. Или что ты имеешь в виду?


X>спасибо.


Нзч
Маньяк Робокряк колесит по городу
Re[2]: имя переменной в компайл-тайм
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.03.18 13:26
Оценка:
Здравствуйте, Marty, Вы писали:

M>Ну, как бы имя переменной и сейчас в компайл-тайм. Или что ты имеешь в виду?


int var;
constexpr const char *varname = get_var_name(var);
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 09.03.2018 13:27 niXman . Предыдущая версия .
Re[4]: имя переменной в компайл-тайм
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.03.18 13:34
Оценка:
Здравствуйте, watchmaker, Вы писали:

так это я знаю, потому и спрашиваю про стандарт
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: имя переменной в компайл-тайм
От: _NN_  
Дата: 10.03.18 15:03
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


X>подскажите, плиз, планируется ли сабж в каком-то из будущих стандартов?

Я так понимаю ищем аналог C# nameof ?
Чем макрос не вариант ?

Скажем такой для отсева ошибок вида NAMEOF(123):
#define NAMEOF(variable) ((decltype(&variable))nullptr, #variable)


https://stackoverflow.com/a/38697366/558098
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 12.03.18 17:28
Оценка:
Здравствуйте, YuriV, Вы писали:

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


YV>На основе __PRETTY_FUNCTION__ целый CTTI написан:

Жалко только что сие не compile time, один из немногих профитов microsoft то, что __FUNСSIG__ (аналог __PRETTY_FUNCTION__) можно вставлять
в #pragma message (__FUNCSIG__) и получать месседжи на этапе компиляции .
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Отредактировано 12.03.2018 17:44 Маркуша Шулин . Предыдущая версия .
Re: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 12.03.18 17:43
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


X>подскажите, плиз, планируется ли сабж в каком-то из будущих стандартов?


X>спасибо.

вообще хотелось бы итеративное поведение, что и подразумевается рефлексией ..
struct my_struct
{
  inline void my_func(int arg1, int arg2);
};

template <typename C, typename R, typename ...Args>
auto std::bind(R C::*fptr func) 
{
#   pragma message (get_arg_identifier<1, decltype(func)>())
    return bind_impl(func);
}

и вообще возможность получать compile expressions

template <typename Arg>
inline auto foo (Arg arg)
{
   expr_of<decltype(arg)>::type 
    expr;

   do_something_with_expression<decltype(arg)>();

   return expr(1, 2, 3);
}

void foomain() {
   int x0 = 0, x1 = 1, x2 = 2;
   foo(x0 * (x2 + x1));          
}

в таком ключе итерационность по переменным — это значительный профит

Сейчас во всяких эйгенах и компайлтайм аджинтах \ и прочих template time expressions это делается через треш, и мало что с ним можно делать.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Отредактировано 12.03.2018 17:45 Маркуша Шулин . Предыдущая версия . Еще …
Отредактировано 12.03.2018 17:45 Маркуша Шулин . Предыдущая версия .
Re[2]: имя переменной в компайл-тайм
От: Ops Россия  
Дата: 13.03.18 14:17
Оценка:
Здравствуйте, rg45, Вы писали:

R>Кто после этого скажет, что в C++ нет рефлексии?


А давно в C++ есть __PRETTY_FUNCTION__ ? Я что-то пропустил?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 14.03.18 03:52
Оценка:
Здравствуйте, Ops, Вы писали:

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


R>>Кто после этого скажет, что в C++ нет рефлексии?


Ops>А давно в C++ есть __PRETTY_FUNCTION__ ? Я что-то пропустил?

Gcc extentions — давненько. Мелкомягкие тут чуток впереди их __FUNCSIG__ дают возможность использоваться в компайлайм.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[4]: имя переменной в компайл-тайм
От: Ops Россия  
Дата: 14.03.18 08:02
Оценка:
Здравствуйте, ollv, Вы писали:

Ops>>А давно в C++ есть __PRETTY_FUNCTION__ ? Я что-то пропустил?

O>Gcc extentions — давненько. Мелкомягкие тут чуток впереди их __FUNCSIG__ дают возможность использоваться в компайлайм.

Я не про компиляторы, а про язык.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 14.03.18 22:49
Оценка:
Здравствуйте, Ops, Вы писали:

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


Ops>>>А давно в C++ есть __PRETTY_FUNCTION__ ? Я что-то пропустил?

O>>Gcc extentions — давненько. Мелкомягкие тут чуток впереди их __FUNCSIG__ дают возможность использоваться в компайлайм.

Ops>Я не про компиляторы, а про язык.

The first of these is __func__, which is part of the C99 standard:

ну язык — понятие растяжимое. можно считать языком только то, что попадает в синтакс три, а можно, все включая препроцессор и почее.
Вообще я там ниже согласен, на счет того, кто и что понимает. ) кроме того, последние тенденции оч хорошо показывают, что вчера языком не является впоследствии начинает им являться.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Отредактировано 14.03.2018 22:50 Маркуша Шулин . Предыдущая версия .
Re[6]: имя переменной в компайл-тайм
От: YuriV  
Дата: 16.03.18 09:07
Оценка:
Здравствуйте, ollv, Вы писали:

CTTI именно компайлтайм в отличии от стандартного typeinfo. А то, что в прагме не работает так это проблемы прагма месседж скорее, ведь стандарта на эти макросы нет.
Re[7]: имя переменной в компайл-тайм
От: rg45 СССР  
Дата: 16.03.18 09:43
Оценка:
Здравствуйте, YuriV, Вы писали:

YV>CTTI именно компайлтайм в отличии от стандартного typeinfo. А то, что в прагме не работает так это проблемы прагма месседж скорее, ведь стандарта на эти макросы нет.


Кстати, я вот этот момент несколько недогоняю. С одной стороны, такие макросы как __PRETTY_FUNCTION__ и __FUNCSIG__, хоть и являются нестандартными расширениями, тем не менее, это макросы препроцессора. С другой стороны, эти макросы определены только для тех шаблонных функций, которые прошли через инстанцирование, которое, как известно, выполняется на этапе компиляции (точнее говоря, в восьмой фазе трансляции, в ходе которой образуются т.н. instantiation units. Но так или иначе, это уже фаза, следующая после препроцессора). Вот и выходит, что это макросы, значение которых становится известным после/во время компиляции. Как так? Уж не по той ли причине их не торопятся вносить в стандарт, что их невозможно реализовать без размывания концепции?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 16.03.2018 9:55 rg45 . Предыдущая версия . Еще …
Отредактировано 16.03.2018 9:52 rg45 . Предыдущая версия .
Отредактировано 16.03.2018 9:50 rg45 . Предыдущая версия .
Re[7]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 16.03.18 13:58
Оценка:
Здравствуйте, YuriV, Вы писали:

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


YV>CTTI именно компайлтайм в отличии от стандартного typeinfo.

__PRETTY_FUNCTION__ не дает тип который может использоваться в compiletime хотя эта константа и формируется за счет compiletime.
error: ‘__PRETTY_FUNCTION__’ cannot appear in a constant-expression
#include <iostream>

template <char const* c>
struct cmpval
{
  ~cmpval() { std::cout << c <<std::endl; }
};

char string_value[] = "string value";

int main()
{
  cmpval<string_value> s_type;

# pragma message __PRETTY_FUNCTION__
  return 1;
}


вставь в cmpval __PRETTY_FUNCTION__ я об этом. Да и по сути меня волнует тут только один вопрос
— мессаджи которые помагают дебажить компайл тайм алгоритмику ..
CTTI и прочее, я не обсуждал.

YV>А то, что в прагме не работает так это проблемы прагма месседж скорее, ведь стандарта на эти макросы нет.

И ?
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[8]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 16.03.18 14:17
Оценка:
Здравствуйте, rg45, Вы писали:

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


YV>>CTTI именно компайлтайм в отличии от стандартного typeinfo. А то, что в прагме не работает так это проблемы прагма месседж скорее, ведь стандарта на эти макросы нет.


R>Кстати, я вот этот момент несколько недогоняю. С одной стороны, такие макросы как __PRETTY_FUNCTION__ и __FUNCSIG__, хоть и являются нестандартными расширениями, тем не менее, это макросы препроцессора. С другой стороны, эти макросы определены только для тех шаблонных функций, которые прошли через инстанцирование, которое, как известно, выполняется на этапе компиляции (точнее говоря, в восьмой фазе трансляции, в ходе которой образуются т.н. instantiation units. Но так или иначе, это уже фаза, следующая после препроцессора). Вот и выходит, что это макросы, значение которых становится известным после/во время компиляции. Как так? Уж не по той ли причине их не торопятся вносить в стандарт, что их невозможно реализовать без размывания концепции?


Ах, в данном случае мне кажется удобство главное. Пока удобно и обеспечивает обратную совместимость, все гуд. Т.к. это напрямую деньги, так что появление этих сущнoстей (что на самом деле не совсем макрос т.к. лайфтайм у них не только на этапе работы препроцессора, как я понимаю.) в стандарте не столь важно. А вот их пропадание скорее всего маловероятно.

Куда более интересный вопрос .. апдейт по SG7
недавно приходило на группу :

ust as a heads up for those here in Jacksonville...

Our evening session tonight (2018-03-14) will actually cover *all* the reflection material this week. Unless we run out of time with substantial unfinished work, we will avoid the Friday evening session.

The discussion will focus on, in order:
http://wg21.link/p0953 — constexpr reflexpr
http://wg21.link/p0954 — what do we want to do with reflection?
http://wg21.link/p0707 — metaclasses (just a brief update)

We will also briefly discuss a plan for offline feedback for p0957.

There are also late papers on implementation experience attached to the wiki (p0992, p0993). While we won't explicitly cover them as they arrived during the week and talking to folks I don't think people have had time to dig into them at all. But I want to draw folks' attention to this.

там и последнее ишью по компайлтайм рефлекшину на базе CLang ну и метаклассы Саттера и что-то Страуструпа


Вообще я по этим темам использую сложившуюся уже практику (как по мне) отдельеного описания метаинформации для классов, все никак не собирусь выкласть что-то сюда.

выглядит примерно так

struct mystruct
{
   int f0_; 
   std::string f1_;
   int foo(int a0, int a1, std::string const& a2);
};

METACLASS(mystruct, f0_, f1_, foo);

int main() {
   
   myserializer() << mystruct { 0, "1" };

   auto r = cast<int>(callbyname(mystruct{0, "1"}, "foo", 1, 2, "3"));

   static_assert(metaclass_find_func<mystruct, foo_tag>::value, "Func not found.");
   
   int r = call_by_tag<foo_tag>(mystruct{0, "1"}, 1, 2, "3");

   //This a problem 
   make_json_call<foo_tag>(mystruct{0, "1"}, 1, 2, "3");

}


Так вот для такой практики, чтобы полностью удовлетворить рефлекшин ишью, надо знать имена аргументов если филды еще обработать препроцессором можно
, то с аргументами все сложнее и некрасивеею Потому мне тема показалась интересной.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Отредактировано 16.03.2018 15:09 Маркуша Шулин . Предыдущая версия . Еще …
Отредактировано 16.03.2018 14:19 Маркуша Шулин . Предыдущая версия .
Re[8]: имя переменной в компайл-тайм
От: YuriV  
Дата: 18.03.18 07:16
Оценка:
Здравствуйте, ollv, Вы писали:

YV>>А то, что в прагме не работает так это проблемы прагма месседж скорее, ведь стандарта на эти макросы нет.

O> И ?

Что И? Я говорил про CTTI, она свои функции выполняет, а про __PRETTY_FUNCTION__, которая не predefined macro вы заговорили. Если лень гуглить, то:

Expanding __func__ at preprocessing time requires the preprocessor to know which function it's processing. The preprocessor generally doesn't know that, because parsing happens after the preprocessor is already done. Some implementations combine the preprocessing and the parsing, and in those implementations, it would have been possible for __func__ to work the way you'd like it to. In fact, if I recall correctly, MSVC's __FUNCTION__ works like that. It's an unreasonable demand on implementations that separate the phases of translation though.



У майкрософта свой вэй
Re[9]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 18.03.18 10:14
Оценка:
Здравствуйте, YuriV, Вы писали:

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


YV>>>А то, что в прагме не работает так это проблемы прагма месседж скорее, ведь стандарта на эти макросы нет.

O>> И ?

YV>Что И? Я говорил про CTTI,

А я говорил про __PRETTY_FUNCTION__
YV>она свои функции выполняет, а про __PRETTY_FUNCTION__, которая не predefined macro вы заговорили. Если лень гуглить, то:
Вот просто перечитайте сообщение —
__PRETTY_FUNCTION__ — не компайлтайм сущность, все. Инче всавьте это в компайлтайм параметром, в отличие от __FUNCSIG__ (в остальном они эквиваленты, дает сигнатуру фанкшина в момент инстанциации). Говорить тут больше не о чем.

YV>

YV>Expanding __func__ at preprocessing time requires the preprocessor to know which function it's processing. The preprocessor generally doesn't know that, because parsing happens after the preprocessor is already done. Some implementations combine the preprocessing and the parsing, and in those implementations, it would have been possible for __func__ to work the way you'd like it to. In fact, if I recall correctly, MSVC's __FUNCTION__ works like that. It's an unreasonable demand on implementations that separate the phases of translation though.

YV>
И?

YV>У майкрософта свой вэй

Претти фашкшин тоже генерируется на инстанциации метода, а значит — уже на этапе синтаксического анализа (причем на разных линиях трансляции могут иметь разные значения). А не препроцессинга,
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[10]: имя переменной в компайл-тайм
От: YuriV  
Дата: 18.03.18 11:02
Оценка:
Здравствуйте, ollv, Вы писали:

YV>>У майкрософта свой вэй

O> Претти фашкшин тоже генерируется на инстанциации метода, а значит — уже на этапе синтаксического анализа (причем на разных линиях трансляции могут иметь разные значения). А не препроцессинга,

И? Как это мешает CTTI работать с типами в компайл-тайм? Она не может напечатать тип в выхлопе компайлера? Мне лично это не нужно, если нужно вам собирите гцц с патчем для поддержки static_print, ну или напишите в спортлоторазрабам гцц. Я вообще не пойму ваших претензий. Я писал конкретно про CTTI и о том что она использует трик с __PRETTY_FUNCTION__ — какое мне дело выводится этот макрос через прагму или нет? У меня тоже претензия, почему я не могу использовать в static_assert const char* str, как параметр шаблона могу, а как аргумент static_assert не могу? Это более удивительно.
Отредактировано 18.03.2018 11:03 YuriV . Предыдущая версия .
Re[11]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 18.03.18 11:33
Оценка:
Здравствуйте, YuriV, Вы писали:

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


YV>>>У майкрософта свой вэй

O>> Претти фашкшин тоже генерируется на инстанциации метода, а значит — уже на этапе синтаксического анализа (причем на разных линиях трансляции могут иметь разные значения). А не препроцессинга,

YV>И? Как это мешает CTTI работать с типами в компайл-тайм? Она не может напечатать тип в выхлопе компайлера? Мне лично это не нужно, если нужно вам собирите гцц с патчем для поддержки static_print, ну или напишите в спортлоторазрабам гцц. Я вообще не пойму ваших претензий.

Я — практик, у меня нет притензий, а есть констатация факта. Не вижу смысла вести дискуссию ниочем. Мое заявление не касалось CTTI, оно касалось
1. что __PRETTY_FUNCTION__ не компайл тайм константа. все.
2. ну то, что это не макро, это и ежу понятно было с самого начала .. так, что я про это даже не говорил.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[10]: имя переменной в компайл-тайм
От: rg45 СССР  
Дата: 18.03.18 11:59
Оценка:
Здравствуйте, ollv, Вы писали:

O>__PRETTY_FUNCTION__ — не компайлтайм сущность, все. Инче всавьте это в компайлтайм параметром, в отличие от __FUNCSIG__ (в остальном они эквиваленты, дает сигнатуру фанкшина в момент инстанциации). Говорить тут больше не о чем.


__PRETTY_FUNCTION__ — компайлтайм сущность (не прероцессор, но компайл тайм):

https://ideone.com/axqWj0

#include <iostream>

template <typename T>
constexpr size_t get_pretty_function_size()
{
  return sizeof(__PRETTY_FUNCTION__);
}

static_assert(87 == get_pretty_function_size<int>(), "invalid size");
static_assert(90 == get_pretty_function_size<double>(), "invalid size");
static_assert(116 == get_pretty_function_size<std::string>(), "invalid size");
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 18.03.2018 12:00 rg45 . Предыдущая версия .
Re[11]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 18.03.18 12:18
Оценка:
Здравствуйте, rg45, Вы писали:

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


O>>__PRETTY_FUNCTION__ — не компайлтайм сущность, все. Инче всавьте это в компайлтайм параметром, в отличие от __FUNCSIG__ (в остальном они эквиваленты, дает сигнатуру фанкшина в момент инстанциации). Говорить тут больше не о чем.


R>__PRETTY_FUNCTION__ — компайлтайм сущность (не прероцессор, но компайл тайм):


R>https://ideone.com/axqWj0


R>
R>#include <iostream>

R>template <typename T>
R>constexpr size_t get_pretty_function_size()
R>{
R>  return sizeof(__PRETTY_FUNCTION__);
R>}

R>static_assert(87 == get_pretty_function_size<int>(), "invalid size");
R>static_assert(90 == get_pretty_function_size<double>(), "invalid size");
R>static_assert(116 == get_pretty_function_size<std::string>(), "invalid size");
R>

Из данного примера выходит, что размер __PRETTY_FUNCTION__ компайл тайм сущность.

https://ideone.com/vspbCM
под эти требования попадет любой явно задаанный эррей, не преобразовавшийся в тривиальный поинтер.

template <int SS> struct sizeof_struct { char a__[SS]; };

template <typename T, int Size>
inline sizeof_struct<Size> count_of_array(T (&a)[Size]) {}

int main()
{
   static_assert(sizeof(count_of_array("")) == 1, "It is not a compiletime array");
}
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[12]: имя переменной в компайл-тайм
От: rg45 СССР  
Дата: 18.03.18 12:26
Оценка:
Здравствуйте, ollv, Вы писали:

O> Из данного примера выходит, что размер __PRETTY_FUNCTION__ компайл тайм сущность.


Если пример с sizeof не достаточно убедителен, можно получить даже отдельные символы из __PRETTYY_FUNCTION__ в компайл тайм:

https://ideone.com/mPh41g

template <typename T, size_t I>
constexpr char get_pretty_function_at()
{
  return __PRETTY_FUNCTION__[I];
}

static_assert('i' == get_pretty_function_at<int, 42>(), "invalid symbol");
static_assert('e' == get_pretty_function_at<double, 55>(), "invalid symbol");
static_assert('b' == get_pretty_function_at<std::string, 64>(), "invalid symbol");
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 18.03.2018 12:30 rg45 . Предыдущая версия .
Re[13]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 18.03.18 13:01
Оценка:
Здравствуйте, rg45, Вы писали:

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


O>> Из данного примера выходит, что размер __PRETTY_FUNCTION__ компайл тайм сущность.


R>Если пример с sizeof не достаточно убедителен, можно получить даже отдельные символы из __PRETTYY_FUNCTION__ в компайл тайм:


R>https://ideone.com/mPh41g


R>
R>template <typename T, size_t I>
R>constexpr char get_pretty_function_at()
R>{
R>  return __PRETTY_FUNCTION__[I];
R>}

R>static_assert('i' == get_pretty_function_at<int, 42>(), "invalid symbol");
R>static_assert('e' == get_pretty_function_at<double, 55>(), "invalid symbol");
R>static_assert('b' == get_pretty_function_at<std::string, 64>(), "invalid symbol");
R>


проапдейтим.
https://ideone.com/n7BbaZ

  static_assert("1"[0] == '1', "It is not a compiletime array");

Вообще, я тут должен кое что уточнить, в gcc есть возможность работать со строковыми литералами в компайл тайм.
что неплохо используется в MPLLIB И вполне парсить их,
https://github.com/sabel83/mpllibs/blob/master/libs/safe_printf/example/validate/main.cpp
я даже часть парсера регулярок реализовывал на базе этого.
Но вот именно в преттифанкшин, эта странность, что сделать из него параметр шаблона — не выходит. Хотя просто хотелось бы просто сделать из нее параметр для для прагмы мессадж ..
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Отредактировано 18.03.2018 13:09 Маркуша Шулин . Предыдущая версия .
Re[14]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 18.03.18 13:14
Оценка:
Здравствуйте, ollv, Вы писали:

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


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


O>>> Из данного примера выходит, что размер __PRETTY_FUNCTION__ компайл тайм сущность.


R>>Если пример с sizeof не достаточно убедителен, можно получить даже отдельные символы из __PRETTYY_FUNCTION__ в компайл тайм:


R>>https://ideone.com/mPh41g


R>>
R>>template <typename T, size_t I>
R>>constexpr char get_pretty_function_at()
R>>{
R>>  return __PRETTY_FUNCTION__[I];
R>>}

R>>static_assert('i' == get_pretty_function_at<int, 42>(), "invalid symbol");
R>>static_assert('e' == get_pretty_function_at<double, 55>(), "invalid symbol");
R>>static_assert('b' == get_pretty_function_at<std::string, 64>(), "invalid symbol");
R>>


O> проапдейтим.

O>https://ideone.com/n7BbaZ
O>

O>  static_assert("1"[0] == '1', "It is not a compiletime array");

O>

O> Вообще, я тут должен кое что уточнить, в gcc есть возможность работать со строковыми литералами в компайл тайм.
O>что неплохо используется в MPLLIB И вполне парсить их,
O>https://github.com/sabel83/mpllibs/blob/master/libs/safe_printf/example/validate/main.cpp
O>я даже часть парсера регулярок реализовывал на базе этого.
O> Но вот именно в преттифанкшин, эта странность, что сделать из него параметр шаблона — не выходит. Хотя просто хотелось бы просто сделать из нее параметр для для прагмы мессадж ..
Хотя, возможно конечно из него сделать — тот-же коспайл тайм стринг, я не пробовал .. сейчас не досуг. наверное распарсится, без проблем. Скорее он просто как литерал вкомпилируется в .o.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[14]: имя переменной в компайл-тайм
От: rg45 СССР  
Дата: 18.03.18 13:33
Оценка:
Здравствуйте, ollv, Вы писали:

O> Вообще, я тут должен кое что уточнить, в gcc есть возможность работать со строковыми литералами в компайл тайм.


Эта возможность есть в любом компиляторе, соответствующем требованиям стандарта языка. Вот здесь даже есть пример реализайции класса компайл-тайм строк (ищи class str_const).

O> Но вот именно в преттифанкшин, эта странность, что сделать из него параметр шаблона — не выходит.


Это не выходит просто потому, что __PRETTY_FUNCTION__ не имеет внешнего связвания (external linkage), а вовсе не потому, что она не является компайл-тайм сущностью.
--
Справедливость выше закона. А человечность выше справедливости.
Re[15]: имя переменной в компайл-тайм
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 18.03.18 14:04
Оценка:
Здравствуйте, rg45, Вы писали:

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


O>> Вообще, я тут должен кое что уточнить, в gcc есть возможность работать со строковыми литералами в компайл тайм.


R>Эта возможность есть в любом компиляторе,

это на мелкомягких не cкомпилируется. msvc13 на 15 вроде тоже пробовал.
static_assert("1"[0] == '1', "no ");


R>соответствующем требованиям стандарта языка. Вот здесь даже есть пример реализайции класса компайл-тайм строк (ищи class str_const).

я ж говорю — писал парсер регулярных выражний, на строковых литералах. Там все компайлтайм. чет типа такого :
static_assert(std::is_same<search<STR("w++"), STR("[\+]+")>::value, STR("++")>::value, "Not matched");


O>> Но вот именно в преттифанкшин, эта странность, что сделать из него параметр шаблона — не выходит.


R>Это не выходит просто потому, что __PRETTY_FUNCTION__ не имеет внешнего связвания (external linkage), а вовсе не потому, что она не является компайл-тайм сущностью.

https://ideone.com/oXQVtY
ведет он себя как обычный эррей но не как строковый литерал.
В общем, давай просто разберемся, что я подразумевал под компайл тайм сущностью — он не может использоваться параметром шаблона. И не используем в pragma message больше ничего.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Отредактировано 18.03.2018 14:17 Маркуша Шулин . Предыдущая версия . Еще …
Отредактировано 18.03.2018 14:05 Маркуша Шулин . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.