我有一個問題,如果我們有 aclass A和其他類 from class B : class Atoclass Z : class A繼承自class A,并且我們有一個std::vector<A>包含 from class Ato所有型別物件的向量,class Z我們如何從該向量中獲取特定型別的物件,例如我們想要獲取物件,這是E如何獲取該物件的型別。
class A {};
class B : A {};
class C : A {};
...
class Z : A {};
std::vector<A> vec; // lets say it contains objects of type A to Z
template<typename T>
T GetObject()
{
for (int i = 0; i < vec.size(); i )
{
//if type of vec[i] == type of T return vec[i]
}
}
E obj = GetObject<E>();
我用過這樣的東西
if (typeid(vec[i]) == typeid(T))
{
return vec[i];
}
但它不起作用。
uj5u.com熱心網友回復:
您不能將 的子型別存盤A在std::vector<A>. 您放入其中的任何子型別的物件都被切片,并且向量中的每個元素都是 type 的物件A。
你可以用 astd::vector<std::variant<A, ..., Z>>代替。不過,您可能應該考慮另一種設計:
#define TYPES(x) \
x(B) \
x(C) \
x(D) \
x(E) \
x(F) \
x(G) \
x(H) \
x(I) \
x(J) \
x(K) \
x(L) \
x(M) \
x(N) \
x(O) \
x(P) \
x(Q) \
x(R) \
x(S) \
x(T) \
x(U) \
x(V) \
x(W) \
x(X) \
x(Y) \
x(Z)
#define DECLARE(x) struct x { void operator()() {std::cout << #x << '\n'; } };
#define EMPLACE(x) data.emplace_back(x{});
#define TYPE_PARAMS(x) ,x
DECLARE(A);
TYPES(DECLARE);
using Variant = std::variant<A TYPES(TYPE_PARAMS)>;
int main() {
std::vector<Variant> data;
EMPLACE(A);
TYPES(EMPLACE);
using SearchedType = E;
auto pos = std::find_if(data.begin(), data.end(), [](Variant const& v) { return std::holds_alternative<SearchedType>(v); });
if (pos != data.end())
{
std::visit([](auto& v) { v(); }, *pos);
}
}
另一種方法是宣告一個模板變數:
template<class T>
T object{};
int main() {
using SearchedType = E;
object<SearchedType>();
}
另一種選擇是添加一個虛擬解構式A并使用std::vector<std::unique_ptr<A>>結合dynamic_cast...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/511331.html
標籤:C 目的哎呀模板类型
上一篇:if分支是否比else分支快?
