Я играл с пакетами параметров в c ++, и вот чего я хотел бы достичь:
У меня есть 3 структуры:
struct Base {
Base(int x) : x(41) {}
int x;
};
struct A : Base {
A() : Base(41) {}
};
struct B : Base {
B() : Base(42) {}
};
И я хотел бы создать обобщение c функция, которая возвращает кортеж с экземплярами указанных типов, т.е.
magicFunction<A,B,A,B,A> == std::tuple{A(), B(), A(), B(), A()}
magicFunction<A,B,A> == std::tuple{A(), B(), A()}
Я пытался использовать специализацию шаблонов для расширения типов, но, к сожалению, не смог этого сделать (я понимаю, почему это не так скомпилировать, просто не знаю как это исправить :))
template<typename isEmpty, typename ...T>
struct ExpanderImpl {
};
template<typename Head, typename ... Rest>
struct ExpanderImpl<std::false_type, Head, Rest...> {
static std::tuple<Head, Rest...> getValues() {
if(sizeof...(Rest) > 0) {
return std::tuple_cat(std::tuple{Head()}, ExpanderImpl<std::false_type, Rest...>::getValues());
} else {
return std::tuple_cat(std::tuple{Head()}, ExpanderImpl<std::true_type, Rest...>::getValues());
}
}
};
template<typename ...Empty>
struct ExpanderImpl<std::true_type, Empty...> {
static std::tuple<Empty...> getValues() {
return {};
}
};
template<typename ...T>
struct Expander {
static std::tuple<T...> getValues() {
if(sizeof...(T) > 0) {
return ExpanderImpl<std::false_type, T...>::getValues();
} else {
return ExpanderImpl<std::true_type, T...>::getValues();
}
}
};
Есть предложения как это исправить? Кроме того, есть ли лучший способ достичь того, что я хочу?
Полный код можно найти здесь здесь . Спасибо за помощь.