C++是否有一个容器,每个类型最多存储一个对象

Does C++ have a container that stores at most one object of each type?

本文关键字:类型 存储 一个对象 有一个 是否 C++      更新时间:2023-10-16

我觉得我以前见过这样的东西,但在网上找不到任何引用。也许我只是不知道谷歌该怎么办。

需要明确的是,我的意思是提供大致这样的功能:

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的主要限制是它有一个固定的、由编译时决定的大小。如果你需要一个灵活大小的容器,你正在设计的解决方案更合适。