我正在處理一個 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向向量中添加元素。我想將元素添加到lvalue名為actual( ) 的向量中,vec但相反,該元素被添加到rvalue. 有沒有辦法將元素添加到vec使用命名的向量中std::any。如果沒有,那么有沒有其他方法可以做到這一點,例如使用std::variant或我可能不知道的其他方法。我正在尋找一種在任何版本的 C (如 C 11 或 C 17 等)中執行此操作的方法。
在我的實際專案中,需要存盤任何型別的物件。所以我在那里遇到了同樣的問題。然后意識到出了什么問題(即,我們push_back在右值上使用),然后我將問題簡化為最小的可重現示例,并在這里詢問。
uj5u.com熱心網友回復:
我們在右值上使用 push_back
不,這不是問題。any存盤所給內容的副本。它不參考其他物件。它根據給定的東西創建一個物件。因此,即使您獲得了對 中物件的參考any,它也不會是對vec自身的參考。
如果要在 中存盤對物件的參考any,則需要通過存盤指向reference_wrapper該物件的指標或 a來顯式執行此操作:
using ref_type = decltype(std::ref(vec));
std::any anything = std::ref(vec);
std::any_cast<ref_type>(anything).get().push_back(4);
請注意,any參考物件是危險的。如果它any的生命周期超過被參考物件的生命周期,那么當您嘗試訪問被參考物件時,您會遇到不好的事情。這是any默認情況下存盤副本的部分原因。
uj5u.com熱心網友回復:
你錯過了一個參考:
std::any_cast<std::vector<int>&>(anything).push_back(4);
// ^
目前,您使用std::any_cast.
注意:正如 Nicol Bolas 所指出的,這只是避免了對演員表的復制,但不會避免將首字母復制std::vector到 中std::any。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385112.html
