【发布时间】:2021-07-04 13:09:12
【问题描述】:
天箭链接:https://godbolt.org/z/18nseEn4G
我有一个包含各种类型向量(强制转换为 void*)的 std::map 和一个 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
或者,有没有“更好的方法”来实现这一点?
【问题讨论】:
-
使用
void*和typeid通常是不好的迹象。特别是没有RAII。这可能会使用类型擦除以更安全的方式实现。 -
当然,我可以在 void* 上使用 std::any,但我只是在 Godbolt 上做一个快速而肮脏的例子,作为以后更具体实施的基础。同样的原因我没有删除任何这些分配或将它们放入智能指针中,我只是想要一个快速而肮脏的基线。
-
我在答案中提供了一个示例类型擦除实现
标签: c++ variadic-templates parameter-pack