根据类C ++运行代码

时间:2016-09-06 14:42:55

标签: c++ oop templates c++11 vector

我正在尝试根据模板类型T传递给哪个类来运行不同的代码。
我有两个班级:MediaCustomer 我有一个模板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")); 

3 个答案:

答案 0 :(得分:6)

如果您有两种已知类型,则无需将其设为模板。

你可以拥有:

void add( Customer c );
void add( Media m );

答案 1 :(得分:6)

代码中if() else if()语句的问题是

allCustomers.push_back(type);

会为类型Media(假设allCustomersstd::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";
}

如果您有除CustomerMedia之外的其他类型的通用模板实现,您也可以使用模板专业化:

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)它将无法编译。