LINUX.ORG.RU

Передать в parameter pack индексы

 


0

1

Товарищи, хочется так:

#include <array>
#include <tuple>
using namespace std;

struct Q {
    void set(int i) {}
};

template <int I>
struct S {
    Q mq[I];
    template <size_t ...num>
    void f(array<int, I> &a,
            index_sequence<num...> n=make_index_sequence<I>{}) {
        ((mq[num].set(a[num])), ...);
    }
};

int main() {
    S<3> s;
    array a{2, 5, 7};
    s.f(a);
}

Но почему-то не выходит передать make_index_sequence{} в качестве дефолтного аргумента. Работает, если над f вызовом накостылить обёртку:

	template <size_t ...num>
	void f_ok(array<int, I> &a) {
		f(a, make_index_sequence<I>{});
	}

и дёргать её, но наличие доп сущности восторг не вызывает. Может есть ещё какой вариант передать в parameter pack индексы без подобного (f_ok()) костыля?

★★

Последнее исправление: kvpfs (всего исправлений: 1)
Ответ на: комментарий от Siborgium

Ну так это тот же доп костыль что и у меня (f_ok), хотелось бы прям совсем без него, одна единственная f() и всё (без доп перегрузок и прочего).

Вообще не очень поянтно, почему нельзя передать make_index_sequence{} как дефолтный аргумент, сообщение от ГЦЦ вообще выглядит похожим на какую-то внутреннюю ошибку «nontype_argument_pack’ not supported by dump_expr<expression error»

kvpfs ★★
() автор топика
Ответ на: комментарий от kvpfs

Да, выглядит похожим. Советую написать в их багзиллу по этому поводу.

Siborgium ★★★★★
()
Ответ на: комментарий от kvpfs

Внутренняя ошибка и есть:

#define pp_unsupported_tree(PP, T)                         \
  pp_verbatim (PP, "%qs not supported by %s", \
	       get_tree_code_name (TREE_CODE (T)), __FUNCTION__)
xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.