C++是否有一个容器,每个类型最多存储一个对象
Does C++ have a container that stores at most one object of each type?
我觉得我以前见过这样的东西,但在网上找不到任何引用。也许我只是不知道谷歌该怎么办。
需要明确的是,我的意思是提供大致这样的功能:
template<class... Types>
class VariantContainer {
private:
std::vector<std::variant<Types...>> m_values;
public:
template<class T>
void add(const T &t) {
static_assert(std::disjunction_v<std::is_same<T, Types>...>);
for(int i = 0; i < m_values.size(); i++) {
if(std::holds_alternative<T>(m_values[i])) {
m_values[i] = t;
return;
}
}
m_values.push_back(t);
}
template<class T>
T get() {
static_assert(std::disjunction_v<std::is_same<T, Types>...>);
for(int i = 0; i < m_values.size(); i++) {
if(std::holds_alternative<T>(m_values[i])) {
return std::get<T>(m_values[i]);
}
}
throw std::runtime_error("Not found");
}
};
或者,它可以具有给定类型的多个元素,并提供一种迭代它们的方法。
这只是我做的一个发烧的梦吗?还是真的存在?
EDIT:现在我重读了我的标题,我可以看到这听起来像一个元组,但这不太适合我的用例。
您可能正在考虑tuple
。
std::tuple<std::string, int, double> tuple{"Test", 15, 14.3};
auto & string = std::get<0>(tuple);
auto & i = std::get<1>(tuple);
auto & d = std::get<2>(tuple);
std::cout << string << std::endl; //Prints Test
std::cout << i << std::endl; //Prints 15
std::cout << d << std::endl; //Prints 14.3
i = 19;
std::cout << std::get<1>(tuple) << std::endl; //Prints 19
auto &[string2, i2, d2] = tuple; //C++17 feature
std::cout << i2 << std::endl; //Prints 19
std::get<1>(tuple) = 3;
std::cout << i << std::endl; //Prints 3
std::cout << i2 << std::endl; //Prints 3
std::tuple
的主要限制是它有一个固定的、由编译时决定的大小。如果你需要一个灵活大小的容器,你正在设计的解决方案更合适。
相关文章:
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- C++ 将 CIN 值存储到任何类型的数组中
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- 在C++中,如何在变量中正确存储 BYTE 类型?
- 多维数组存储三种不同的数据类型?
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 在 JavaScript 中,值的数据类型存储在何处以及如何存储?
- 将Protobuf字节类型存储在二进制文件中
- 如何检查程序是否超过数据类型存储
- 将多调数据类型存储到unique_ptr向量中
- C++元编程:按类型存储整数
- 将多个类型存储到同一个容器中
- 如何打印 boost::any 的向量,当我将元素类型存储在另一个字符串向量中时
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- C++ dynamic_cast vs 将对象类型存储在静态枚举中
- 有没有任何方法可以在运行时将不同的数据类型存储在一个变量中
- 是否可以将Boost uint128_t数据类型存储为原始int类型?
- 使用boost::variant库制作地图.如何以适当的类型存储和显示事物
- 是否可以将对象的类型存储在映射中以进行投射