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