Нужно чудо
От: johny5 Новая Зеландия
Дата: 05.07.21 06:50
Оценка:
Поштурмуем?

Нужна такая штука:

Есть такая запись PACK(a, b), где а — всегда С строка "asd", а b — любое С++ выражение.
Вот в таком контексте нужно чтобы такая запись раскрывалась как a:

static constinit const char* str = SOMETHING1(PACK(a, b));
выражается как
constexpr const char* str = a;


constinit гарантирует что инициализация статической переменной будет выполнено во время компиляции, а значит значение SOMETHING1 тоже должно быть доступно во время компиляции (т.е. constexpr функции или макросы).



А в другом, рантайм контексте:
void func(...) {}
func(SOMETHING2(PACK(a, b)));
выражается как
func(b);


В PACK, SOMETHING1 и SOMETHING2 можно писать что угодно. Могут быть макросы или С++ 20 конструкции.
Re: Нужно чудо
От: Alexander G Украина  
Дата: 05.07.21 07:24
Оценка:
Здравствуйте, johny5, Вы писали:

J>Поштурмуем?


#define PACK(a, b) a, b
#define SOMETHING1(a, b) a
#define SOMETHING2(a, b) b

?
Русский военный корабль идёт ко дну!
Re: Нужно чудо
От: K13 http://akvis.com
Дата: 05.07.21 07:31
Оценка:
J>В PACK, SOMETHING1 и SOMETHING2 можно писать что угодно. Могут быть макросы или С++ 20 конструкции.

#define PACK(...) __VA_ARGS__

template <typename T>
constexpr const char* SOMETHING1( const char *a, T&& )
{
    return a;
}

template <typename T>
constexpr T SOMETHING2( const char *a, T b )
{
    return b;
}


Такое не пойдет?
Re[2]: Нужно чудо
От: K13 http://akvis.com
Дата: 05.07.21 07:33
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>#define PACK(a, b) a, b

AG>#define SOMETHING1(a, b) a
AG>#define SOMETHING2(a, b) b

Не взлетит.
у SOMETHING1 один реальный параметр "PACK(a,b)", а не два.
Re[2]: Нужно чудо
От: johny5 Новая Зеландия
Дата: 05.07.21 11:00
Оценка:
Здравствуйте, K13, Вы писали:

J>>В PACK, SOMETHING1 и SOMETHING2 можно писать что угодно. Могут быть макросы или С++ 20 конструкции.


K13>Такое не пойдет?


https://godbolt.org/z/4r94b71ja

Спасибо, но не взлетает.
Весь затык именно в этой потере constexpr статуса функции SOMETHING1, если второй аргумент — чистый рантайм. Даже не смотря на то что второй аргумент тут вообще не используется.
Re: Нужно чудо
От: watchmaker  
Дата: 05.07.21 11:23
Оценка: +1
Здравствуйте, johny5, Вы писали:

J>Поштурмуем?



J>Есть такая запись PACK(a, b), где авсегда С строка "asd", а b — любое С++ выражение.

J>Вот в таком контексте нужно чтобы такая запись раскрывалась как a:
J>А в другом, рантайм контексте:
J>выражается как
J>func(b);

J>В PACK, SOMETHING1 и SOMETHING2 можно писать что угодно


Вообще непонятно в чём тут может быть сложность с такими условиями:
#define PACK(a, b) b
#define SOMETHING1(_) "asd"
#define SOMETHING1(b) b


Нужно что-то сложнее? В лямбду заверни:
#define PACK(a, b) [&](){ return a; }, [&](){ return b; }
constexpr auto SOMETHING1(auto&& a, auto&& b) { return a(); }
constexpr auto SOMETHING2(auto&& a, auto&& b) { return b(); }


Или if consteval дождись
Re: Нужно чудо
От: · Великобритания  
Дата: 05.07.21 11:34
Оценка: 4 (1)
Здравствуйте, johny5, Вы писали:

j> Нужна такая штука:

Оно?
https://www.boost.org/doc/libs/1_74_0/libs/preprocessor/doc/ref/tuple_elem.html
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Нужно чудо
От: vopl Россия  
Дата: 05.07.21 11:41
Оценка:
Здравствуйте, johny5, Вы писали:

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


J>>>В PACK, SOMETHING1 и SOMETHING2 можно писать что угодно. Могут быть макросы или С++ 20 конструкции.


K13>>Такое не пойдет?


J>https://godbolt.org/z/4r94b71ja


J>Спасибо, но не взлетает.

J>Весь затык именно в этой потере constexpr статуса функции SOMETHING1, если второй аргумент — чистый рантайм. Даже не смотря на то что второй аргумент тут вообще не используется.

#include <iostream>

void func(int b)
{
    std::cout << b << std::endl;
}

#define PACK(a,b) a,b

#define SOMETHING1_(a,b) a
#define SOMETHING1(pack) SOMETHING1_(pack)

#define SOMETHING2_(a,b) b
#define SOMETHING2(pack) SOMETHING2_(pack)

int main(int, char**)
{
    static constinit auto val = SOMETHING1(PACK("asd", rand()));
    std::cout << val << std::endl;
    func(SOMETHING2(PACK("asd", 5)));
}
Re[2]: Нужно чудо
От: johny5 Новая Зеландия
Дата: 05.07.21 22:44
Оценка:
J>>Есть такая запись PACK(a, b), где авсегда С строка "asd", а b — любое С++ выражение.

ААа... поймал, поймал. Должно было быть всегда С строка, например "asd".
Re[2]: Нужно чудо
От: johny5 Новая Зеландия
Дата: 05.07.21 22:45
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Или if consteval дождись


По поводу if consteval, его никак не заменит if(std::is_constant_evaluated())?
Re[2]: Нужно чудо
От: johny5 Новая Зеландия
Дата: 06.07.21 00:19
Оценка:
Здравствуйте, ·, Вы писали:

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


j>> Нужна такая штука:

·>Оно?
·>https://www.boost.org/doc/libs/1_74_0/libs/preprocessor/doc/ref/tuple_elem.html

Спасибо, это подтолкнуло меня к решению моей полной задачи!
Re: Нужно чудо
От: imh0  
Дата: 27.07.21 15:09
Оценка:
Здравствуйте, johny5, Вы писали:

J>Нужна такая штука:


) Не я конечно извияюсь, но коллеги, формулировки задачи явно не ваш конек. Какой-то рантаймконтекст, какой-то constinit.... )
Давайте стараться лучше формулировать! )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.