Есть такая запись PACK(a, b), где а — всегда С строка "asd", а b — любое С++ выражение.
Вот в таком контексте нужно чтобы такая запись раскрывалась как a:
constinit гарантирует что инициализация статической переменной будет выполнено во время компиляции, а значит значение SOMETHING1 тоже должно быть доступно во время компиляции (т.е. constexpr функции или макросы).
А в другом, рантайм контексте:
void func(...) {}
func(SOMETHING2(PACK(a, b)));
выражается как
func(b);
В PACK, SOMETHING1 и SOMETHING2 можно писать что угодно. Могут быть макросы или С++ 20 конструкции.
Здравствуйте, K13, Вы писали:
J>>В PACK, SOMETHING1 и SOMETHING2 можно писать что угодно. Могут быть макросы или С++ 20 конструкции.
K13>Такое не пойдет?
Спасибо, но не взлетает.
Весь затык именно в этой потере constexpr статуса функции SOMETHING1, если второй аргумент — чистый рантайм. Даже не смотря на то что второй аргумент тут вообще не используется.
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(); }
Здравствуйте, 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)));
}
Здравствуйте, johny5, Вы писали:
J>Нужна такая штука:
) Не я конечно извияюсь, но коллеги, формулировки задачи явно не ваш конек. Какой-то рантаймконтекст, какой-то constinit.... )
Давайте стараться лучше формулировать! )