имя переменной в компайл-тайм
От: 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[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[4]: имя переменной в компайл-тайм
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.03.18 13:34
Оценка:
Здравствуйте, watchmaker, Вы писали:

так это я знаю, потому и спрашиваю про стандарт
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: имя переменной в компайл-тайм
От: watchmaker  
Дата: 09.03.18 13:41
Оценка: +1
Здравствуйте, niXman, Вы писали:

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


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

Конечно в будущем запланировано добавить в c++ лучшую поддержку рефлексии. Но вот конкретно эта часть уже доступна и стандартизированна давным-давно.
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: имя переменной в компайл-тайм
От: 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[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[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[4]: имя переменной в компайл-тайм
От: YuriV  
Дата: 12.03.18 17:16
Оценка: 9 (1)
Здравствуйте, rg45, Вы писали:

На основе __PRETTY_FUNCTION__ целый CTTI написан:
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[3]: имя переменной в компайл-тайм
От: rg45 СССР  
Дата: 14.03.18 12:26
Оценка: :)
Здравствуйте, Ops, Вы писали:

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


Что-то мне подсказывает, что ответ на свой вопрос ты знаешь и сам Не стоит воспринимать этот стеб на полном серьезе.
--
Справедливость выше закона. А человечность выше справедливости.
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 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.