Size: a a a

2020 May 11

i

ilynxy in pro.cxx
источник

АК

Александр Караев... in pro.cxx
ilynxy
А подскажите пожалуйста как происходит матчинг variadic аргументов, если у меня, к примеру template<typename... Args> void foo(S& s, Args... args); и я вызываю foo(s, a0, a1, a2) то понятно, а если у меня template<typename... Args0, typename... Args1> void bar(S& s0, Args0...args0, S& s1, Args1...args1); то при попытке bar(s0, a0, a1, s1, a1, a2) не находит соответствия. Почему-то в таком случае, Args0... по мнению clang это пустой список. И как такое победить?
на моей памяти более одного пака в аргументах функции невозможно сделать нормально
источник

OL

Oleg Linkin in pro.cxx
Всем привет. Есть у меня проблема producer-consumer. Есть 2 потока: main, который producer и consumer одновременно и второй, который только producer. Можно ли это как-то синхронизировать через очередь? Или самым простым и нормальным вариантом  будет вынести producer из main потока в отдельный поток, а main оставить только consumer'ом?
источник

IA

Igor Akhmetov in pro.cxx
ilynxy
А подскажите пожалуйста как происходит матчинг variadic аргументов, если у меня, к примеру template<typename... Args> void foo(S& s, Args... args); и я вызываю foo(s, a0, a1, a2) то понятно, а если у меня template<typename... Args0, typename... Args1> void bar(S& s0, Args0...args0, S& s1, Args1...args1); то при попытке bar(s0, a0, a1, s1, a1, a2) не находит соответствия. Почему-то в таком случае, Args0... по мнению clang это пустой список. И как такое победить?
Передайте аргументы через два tuple.
источник

i

ilynxy in pro.cxx
Igor Akhmetov
Передайте аргументы через два tuple.
Мне хотелось бы оставить неизменным интерфейс bar, чтобы не писать bar(s0, make_tuple(a0, a1), s1, make_tuple(a1, s2));
источник

IA

Igor Akhmetov in pro.cxx
ilynxy
Мне хотелось бы оставить неизменным интерфейс bar, чтобы не писать bar(s0, make_tuple(a0, a1), s1, make_tuple(a1, s2));
Ну понятно же что у компилятора нет возможности в общем случае вывести в таком вызове шаблонные параметры.
источник

DF

Dollar Føølish in pro.cxx
По правилаи специфичности наверное
источник

DF

Dollar Føølish in pro.cxx
Если они есть
источник

DF

Dollar Føølish in pro.cxx
Лучше конечно через тупл
источник

i

ilynxy in pro.cxx
Igor Akhmetov
Ну понятно же что у компилятора нет возможности в общем случае вывести в таком вызове шаблонные параметры.
Наверное (хотя для меня это не очевидно). В любом случае непонятно зачем разрешать несколько паков в параметрах шаблона, если они никогда не матчаца
источник

IA

Igor Akhmetov in pro.cxx
ilynxy
Наверное (хотя для меня это не очевидно). В любом случае непонятно зачем разрешать несколько паков в параметрах шаблона, если они никогда не матчаца
См. выше пример с tuple.
источник

v

vehlwn in pro.cxx
ilynxy
Наверное (хотя для меня это не очевидно). В любом случае непонятно зачем разрешать несколько паков в параметрах шаблона, если они никогда не матчаца
В параметрах шаблона не матчатся. В параметрах функции матчатся.
источник

i

ilynxy in pro.cxx
vehlwn
В параметрах шаблона не матчатся. В параметрах функции матчатся.
Дайте пример, пожалуйста.
источник

v

vehlwn in pro.cxx
ilynxy
Дайте пример, пожалуйста.
?
Только что с туплями показали.
источник

i

ilynxy in pro.cxx
Так. Давайте сначала. Кажется я чего-то упустил. У меня есть foo(S, Args...); Я хочу написать такой bar, что bar(s0, a0, a1, s1, a2, ..., sN, argsN...) будет разворачиваться в foo(s0, a0, a1); foo(s1, a2, a3); ...; foo(sN, argsN...);
источник

v

vehlwn in pro.cxx
ilynxy
Дайте пример, пожалуйста.
#include <tuple>

template<class ...A, class ...B>
void f(std::tuple<A...>, std::tuple<B...>);

static_assert(std::is_same_v<void
   ,decltype(f(std::tuple{1,23}, std::tuple{"hk", 6.6, 'k'}))>
);
источник

v

vehlwn in pro.cxx
ilynxy
Так. Давайте сначала. Кажется я чего-то упустил. У меня есть foo(S, Args...); Я хочу написать такой bar, что bar(s0, a0, a1, s1, a2, ..., sN, argsN...) будет разворачиваться в foo(s0, a0, a1); foo(s1, a2, a3); ...; foo(sN, argsN...);
Тебе нужно перебрать вариадические параметры одной функции и инвокать вторую функцию n-1 раз с меньшим числом параметров?
источник

i

ilynxy in pro.cxx
В целом на этот вопрос можно ответить "да". Но только откусывать каждый раз нужно не по одному параметру, а по пачке, где разделителем служит S
источник

i

ilynxy in pro.cxx
то есть a(s0, args0..., s1, args1..., ..., sN, argsN...); инвокает N раз foo: foo(s0, args0...); foo(s1, args1...); ...; foo(sN, argsN);
источник

v

vehlwn in pro.cxx
ilynxy
то есть a(s0, args0..., s1, args1..., ..., sN, argsN...); инвокает N раз foo: foo(s0, args0...); foo(s1, args1...); ...; foo(sN, argsN);
Это невозможно. Как компелятору узнать, какой аргумент принадлежит какому паку?
источник