我正在尝试根据模板类型T
传递给哪个类来运行不同的代码。
我有两个班级:Media
和Customer
我有一个模板T
和一个函数add(T type)
。
我希望它能够有效地识别哪个类被传递为T
并将该类型添加到数组中,如下所示。
template <typename T>
void add(T type){
if(type = Customer) { // This is pseudo code of what I want it to do
allCustomers.push_back(type);
cout << "Added Successfully";
}
else if (type = Media){
allMedia.push_back(type);
cout << "Added Successfully";
}
}
这就是我试图传递它的方式:
add(Media("test","test"));
答案 0 :(得分:6)
如果您有两种已知类型,则无需将其设为模板。
你可以拥有:
void add( Customer c );
void add( Media m );
答案 1 :(得分:6)
代码中if() else if()
语句的问题是
allCustomers.push_back(type);
会为类型Media
(假设allCustomers
是std::vector<Customer>
)提供编译器错误,反之为Customer
和
allMedia.push_back(type);
您可以简单地使用函数重载来执行此操作:
void add(const Customer& type){
allCustomers.push_back(type);
cout << "Added Successfully";
}
void add(const Media& type){
allMedia.push_back(type);
cout << "Added Successfully";
}
如果您有除Customer
和Media
之外的其他类型的通用模板实现,您也可以使用模板专业化:
template<typename T>
void add(const T& type){
anyTypes.push_back(type);
cout << "Added Successfully";
}
template<>
void add(const Customer& type){
allCustomers.push_back(type);
cout << "Added Successfully";
}
template<>
void add(const Media& type){
allMedia.push_back(type);
cout << "Added Successfully";
}
答案 2 :(得分:0)
您想对add
做两个不同的定义(这称为&#34;专业化&#34;):
template<typename T> void add(T);
template<> void add<Customer>(Customer c) {
...
}
template<> void add<Media>(Media m) {
...
}
...
需要template<>
语法来声明您正在专门化模板功能。
这是在编译时静态类型检查的,所以如果你调用add(myPotato)
它将无法编译。