【发布时间】:2022-01-19 16:07:01
【问题描述】:
我正在开发一个 C++17 项目,我正在使用 std::any。下面给出了一个最小的可重现示例,以供参考,解释我想要实现的目标。
#include <any>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> vec{1,2,3};
std::any anything = vec;
// anything.push_back(4);//i want to add an element into vector vec, using variable anything but this statement won't work
std::cout<<std::any_cast<std::vector<int>>(anything).size()<<std::endl;//prints 3
std::any_cast<std::vector<int>>(anything).push_back(4);//this adds(push_back) element into rvalue
std::cout<<std::any_cast<std::vector<int>>(anything).size()<<std::endl;//prints 3 but i want 4
}
从上面的例子可以看出,我有一个std::any 对象,我正在使用std::any_cast 将元素添加到向量中。我想将元素添加到名为 vec 的实际 (lvalue) 向量中,但是将元素添加到 rvalue 中。 有没有办法使用std::any 将元素添加到名为vec 的向量中。 如果没有,那么还有其他方法可以做到这一点,例如使用std::variant 或其他我可能不会的方法意识到。我正在寻找一种在任何版本的 C++(如 C++11 或 C++17 等)中执行此操作的方法。
在我的实际项目中,需要存储任何类型的对象。所以我在那里遇到了同样的问题。然后意识到出了什么问题(即,我们在右值上使用了push_back),然后我将问题简化为一个最小的可重现示例并在这里询问。
【问题讨论】:
-
你为什么使用
std::any?以及为什么要包装(实际上是复制)现有的vector? -
在我的实际项目中,需要存储任何类型的对象。所以我在那里遇到了同样的问题。然后意识到出了什么问题(即,我们在右值上使用
push_back)然后我将问题简化为一个最小的可重现示例并在这里询问。 -
没关系,但为什么还要访问旧的
vector? -
在我看来这不是一个很棒的设计。也许您应该考虑重构您的项目?
-
澄清一下,您是想将元素添加到向量
vec,还是从vec复制构造的anything中存储的向量?您可以互换使用这两者,但它们不是同一个对象。