gpt4 book ai didi

c++ - C++是否有一个容器,最多可以存储每种类型的一个对象?

转载 作者:行者123 更新时间:2023-12-01 14:58:39 28 4
gpt4 key购买 nike

我觉得我以前看过类似的东西,但是找不到在线引用。也许我只是不知道对Google有什么。

明确一点,我的意思是大致提供此功能的东西:

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");
}
};

或者,它可以具有给定类型的多个元素,并提供一种遍历它们的方式。

这只是我做过的发烧梦还是存在?

编辑:现在,我重新阅读了标题,我可以看到听起来像元组,但这不太适合我的用例。

最佳答案

您可能会想到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的主要限制是它具有固定的,由编译时确定的大小。如果您需要尺寸灵活的容器,那么您设计的解决方案更为合适。

关于c++ - C++是否有一个容器,最多可以存储每种类型的一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58561032/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com