【发布时间】:2021-04-28 18:56:14
【问题描述】:
我想在将类型参数包扩展为 std::tuple<...> 时访问类型的索引。
例如,给定一个 <int, double, float> 类型包,我想构建一个如下所示的 std::tuple<...>:
std::tuple<std::array<int,0>, std::array<double,1>, std::array<float, 2>>
// ^ ^ ^ ^ ^ ^
// T I T I T I
这是一个几乎完全符合我要求的实现,但它仅适用于大小为 3 的类型包(请参阅 hack 旁边的评论)。如何解决此问题以独立于 TT...s 大小?
#include <tuple>
#include <utility>
#include <array>
#include <iostream>
template <typename... TT>
struct Foo {
template <std::size_t... Indices>
struct Baz {
std::tuple<std::array<TT,Indices>...> baz;
};
Baz<0,1,2> bar; // <<<=== Here is the hack: I make a fixed-size pack; I want it to match TT...
};
int main() {
Foo<int,double,float> foo;
std::cout << std::get<0>(foo.bar.baz).size() << std::endl;
std::cout << std::get<1>(foo.bar.baz).size() << std::endl;
std::cout << std::get<2>(foo.bar.baz).size() << std::endl;
return 0;
}
【问题讨论】:
-
我只是好奇。我在过去看到过类似的请求,我问自己这些是否只是更多相关代码的示例,有人有兴趣解决的难题,或者这种数据结构是否有实际用途。
-
@2b-t 这不是我使用的真实数据结构。我选择了
std::array,因为它有一个数字模板参数和一个类型模板参数,所以我不需要在示例中显示我自己的模板类型。 -
哦,这确实有道理!非常感谢您的解释。绝对是我最近遇到的最有趣的可变参数模板相关问题之一:我实际上不知道您实际上可以使用两个参数包来执行
std::array<T,I>...。