Godbolt 链接:https ://godbolt.org/z/18nseEn4G
我有一个 std::map 各种类型的向量(强制转换为 void*)和一个T& get<T>
方法,它为我提供了对映射中一个向量中的元素的引用。
class Container {
public:
Container() {
auto v1 = new std::vector<int>({1, 2, 3, 4, 5});
auto v2 = new std::vector<char>({'a','b','c','d','e'});
auto v3 = new std::vector<double>({1.12, 2.34, 3.134, 4.51, 5.101});
items.insert({
std::type_index(typeid(std::vector<int>)),
reinterpret_cast<void*>(v1)
});
items.insert({
std::type_index(typeid(std::vector<char>)),
reinterpret_cast<void*>(v2)
});
items.insert({
std::type_index(typeid(std::vector<double>)),
reinterpret_cast<void*>(v3)
});
}
template<typename T>
T& get(int index) {
auto idx = std::type_index(typeid(std::vector<T>));
auto ptr = items.at(idx);
auto vec = reinterpret_cast<std::vector<T>*>(ptr);
return (*vec)[index];
}
private:
std::map<std::type_index, void*> items {};
};
我希望能够使用结构化绑定来取回对相同索引但在不同向量中的 3 个元素的引用,但我不确定如何创建一个对T& get<T>
方法进行多次调用的元组。像这样的东西;
auto [a, b, c] = myContainer.get_all<int, char, double>(1); // get a reference to an int, a char, and a double from myContainer at index 1.
我目前正在尝试对T& get<T>
参数包中的每个参数进行重复调用,但我无法找出正确的语法。
template<typename... Ts>
auto get_all(int index) {
return std::tuple_cat<Ts...>(
std::make_tuple<Ts>(get<Ts>(index)...)
);
我怎样才能使这项工作?这是我当前尝试的链接: https ://godbolt.org/z/18nseEn4G
或者,是否有“更好的方法”来实现这一目标?