我有一组strut
s,每个都有一个data_t
成员类型(省略其他成员):
struct A { using data_t = int; };
struct B { using data_t = double; };
struct C { using data_t = bool; };
// etc.
在编译时,选择其中的一些来填充复合类型(也带有相应的data_t
成员):
#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>;
};
目前,我正在使用 CMake来填充定义configure_file
的 序列和 的附带内容。是否可以使用可变模板和/或折叠表达式来派生后者?struct
base_t
Foo::data_t
base_t
使用折叠表达式,我可以稍微简化的构造Foo::data_t
,而只需要提供一个整数序列(长度相同):
#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>;
};
但是,这仍然需要Bar::data_t
手动/CMake 配置的内容(这使得它可能容易出错)。我曾希望std::index_sequence
可以使用适当构造的内容来填充helper
模板,但这会产生编译器错误(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
};
我读过一些关于可变参数模板的文章,但不知道它们如何应用于using
语句。我是不是错过了什么窍门?
谢谢