而不是有
template <class T> void addElement(T Obj);
只需重载该函数即可。那会给你
void addElement(const B& Obj)
{
V1.push_back({Obj.Name, Obj});
}
void addElement(const C& Obj)
{
V2.push_back({Obj.Name, Obj});
}
这可以节省您专门化模板或需要 C++17 的所有语法以及if constexpr https://en.cppreference.com/w/cpp/language/if#Constexpr_If在编译时做出决定。
原因
template <class T> void addElement(T Obj){
std::pair<std::string, T> AddedPair(Obj.Name, Obj);
if (typeid(T) == typeid(B))
V1.push_back(AddedPair);
if (typeid(T) == typeid(C))
V2.push_back(AddedPair);
}
不起作用的是每个 if 块中的代码需要有效(即使它永远无法到达),但它不能工作,因为您将在向量中添加不同的类型。if constexpr
有帮助,但我发现重载与打字一样多,并使代码不向后兼容。
这意味着您要么必须专门化模板,例如
template <class T> void addElement(T Obj);
template <> void addElement(B Obj)
{
V1.push_back({Obj.Name, Obj});
}
template <> void addElement(C Obj)
{
V1.push_back({Obj.Name, Obj});
}
或使用if constexpr
:
template <class T> void addElement(T Obj){
std::pair<std::string, T> AddedPair(Obj.Name, Obj);
if constexpr(std::is_same_v<T, B>)
V1.push_back(AddedPair);
if constexpr(std::is_same_v<T, C>)
V2.push_back(AddedPair);
}