Tenho uma coleção de strut
s, cada um com um data_t
tipo de membro (outros membros omitidos):
struct A { using data_t = int; };
struct B { using data_t = double; };
struct C { using data_t = bool; };
// etc.
Em tempo de compilação, uma seleção destes é escolhida para preencher um tipo composto (também, com um data_t
membro correspondente):
#include <tuple>
using base_t = std::tuple<A, B, A, C>;
struct Foo : public base_t {
using data_t = std::tuple<A::data_t, B::data_t, A::data_t, C::data_t>;
};
Atualmente, estou usando o CMake configure_file
para preencher tanto a sequência de struct
s que define base_t
, quanto o conteúdo que o acompanha de Foo::data_t
. É possível derivar o último base_t
usando modelos variádicos e/ou expressões fold?
Usando uma expressão fold, posso simplificar um pouco a construção de Foo::data_t
, em vez de precisar apenas fornecer uma sequência de inteiros (do mesmo comprimento):
#include <utility>
template<size_t... idx>
using helper = std:: tuple<
typename std::tuple_element_t<idx, base_t>::data_t ...
>;
struct Bar : public base_t {
using data_t = helper<0, 1, 2, 3>;
};
No entanto, isso ainda requer que o conteúdo Bar::data_t
seja configurado manualmente/CMake (o que o torna potencialmente propenso a erros). Eu esperava que uma construção adequada std::index_sequence
pudesse ser usada para preencher o helper
modelo, mas isso produz um erro do compilador (Intel C++ 2023.02)
struct Baz : public base_t {
static constexpr auto indices{std::make_index_sequence<std::tuple_size_v<base_t>>};
using data_t = helper<indices>; // error: cannot convert std::index_sequence to size_t
};
Li um pouco sobre modelos variadic, mas não consegui descobrir como eles podem ser aplicados a uma using
declaração. Estou perdendo um truque?
Obrigado