如何创建从 C++17 中的可变参数模板推导出的类型的向量元组?
How to create a tuple of vectors of type deduced from a variadic template in C++17?
我已经实现了一个集合 class,它将元组向量转换为向量元组(它本质上是 AOS 到 SOA 的转换)。此代码适用于两个模板 classes 的示例。我试图通过使用可变参数模板使其更通用。为此,我需要为成员变量 m_col
创建类型。在 C++17 中,是否可以将元组转换为向量元组?所以本例中成员变量的类型 m_col
将自动从模板类型中生成。
template<class T1, class T2>
class Collection
{
std::tuple<std::vector<T1>, std::vector<T2>> m_col;
public:
void addRow(const std::tuple<T1, T2>& data)
{
std::get<0>(m_col).push_back(std::get<0>(data));
std::get<1>(m_col).push_back(std::get<1>(data));
}
void show()
{
std::cout << std::get<0>(m_col1).size() <<std::endl;
}
};
int main()
{
using data_t = std::tuple<int, double>;
data_t data{1,1.0};
using col_t = Collection<int, double>;
col_t col;
col.addRow(data);
col.show();
}
你可以用 std::index_sequence
:
template<class ... Ts>
class Collection
{
std::tuple<std::vector<Ts>...> m_col;
private:
template <std::size_t ... Is>
void addRow(std::index_sequence<Is...>, const std::tuple<Ts...>& data)
{
(std::get<Is>(m_col).push_back(std::get<Is>(data)), ...);
}
public:
void addRow(const std::tuple<Ts...>& data)
{
addRow(std::index_sequence_for<Ts...>(), data);
}
};
您正在使用 C++17,所以...使用模板折叠和一些 std::apply()
怎么样?
我是说
template <typename ... Ts>
class Collection
{
private:
std::tuple<std::vector<Ts>...> m_col;
public:
void addRow (std::tuple<Ts...> const & data)
{
std::apply([&](auto & ... vectors){
std::apply([&](auto & ... values){
(vectors.push_back(values), ...);},
data); },
m_col);
}
void show () const
{
std::apply([](auto & ... vectors){
((std::cout << vectors.size() << '\n'), ...);}, m_col);
}
};
我已经实现了一个集合 class,它将元组向量转换为向量元组(它本质上是 AOS 到 SOA 的转换)。此代码适用于两个模板 classes 的示例。我试图通过使用可变参数模板使其更通用。为此,我需要为成员变量 m_col
创建类型。在 C++17 中,是否可以将元组转换为向量元组?所以本例中成员变量的类型 m_col
将自动从模板类型中生成。
template<class T1, class T2>
class Collection
{
std::tuple<std::vector<T1>, std::vector<T2>> m_col;
public:
void addRow(const std::tuple<T1, T2>& data)
{
std::get<0>(m_col).push_back(std::get<0>(data));
std::get<1>(m_col).push_back(std::get<1>(data));
}
void show()
{
std::cout << std::get<0>(m_col1).size() <<std::endl;
}
};
int main()
{
using data_t = std::tuple<int, double>;
data_t data{1,1.0};
using col_t = Collection<int, double>;
col_t col;
col.addRow(data);
col.show();
}
你可以用 std::index_sequence
:
template<class ... Ts>
class Collection
{
std::tuple<std::vector<Ts>...> m_col;
private:
template <std::size_t ... Is>
void addRow(std::index_sequence<Is...>, const std::tuple<Ts...>& data)
{
(std::get<Is>(m_col).push_back(std::get<Is>(data)), ...);
}
public:
void addRow(const std::tuple<Ts...>& data)
{
addRow(std::index_sequence_for<Ts...>(), data);
}
};
您正在使用 C++17,所以...使用模板折叠和一些 std::apply()
怎么样?
我是说
template <typename ... Ts>
class Collection
{
private:
std::tuple<std::vector<Ts>...> m_col;
public:
void addRow (std::tuple<Ts...> const & data)
{
std::apply([&](auto & ... vectors){
std::apply([&](auto & ... values){
(vectors.push_back(values), ...);},
data); },
m_col);
}
void show () const
{
std::apply([](auto & ... vectors){
((std::cout << vectors.size() << '\n'), ...);}, m_col);
}
};