如何确定传递给模板函数的向量的类型

时间:2017-11-25 17:29:48

标签: c++ templates

大家好,也许你可以帮我解决这个问题,

我有两个向量(vecInt,vecDouble)。显然,一个是sort int,另一个是sort double。

但是如何检查if和else if中的那些向量的类型?

    if (TYPE OF VECTOR == INT) {
        std::cout << "vecInt: ";
    }
    else if (TYPE OF VECTOR == DOUBLE) {
        std::cout << "vecDouble: ";
    }

2 个答案:

答案 0 :(得分:4)

  

但是如何检查if和else if中的那些向量的类型?

你不是。这并不是说你不能,只有你不应该这样做。这种分支不会给你你想要的解决方案,10次中有9次。一个优越的选择是超载。不要添加分支,而是添加对辅助函数的调用,然后重载该函​​数以获取所需的行为。

看起来像这样:

if eachExercise["license_author"] as? String == "wger.de" {

}

确实输出

#include <vector>
#include <iostream>

template<typename T>
void output_helper(std::vector<T>*) {}

void output_helper(std::vector<int>*) {
    std::cout << "vecInt: ";
}

void output_helper(std::vector<double>*) {
    std::cout << "vecDouble: ";
}

template <typename T>
void output(std::vector<T>* vO) {
    output_helper(vO);

    for (size_t i = 0; i < vO->size(); i++) {
        std::cout << (*vO).at(i) << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> v{1, 2, 3};
    output(&v);
    return 0;
}

正如您所见live。重载的一个主要好处是你可以在不修改它的情况下扩展vecInt: 1 2 3 的行为。只需为另一种矢量类型添加重载。

顺便说一句,考虑通过指针抛弃传递,并通过引用传递,就像习惯用C ++一样。

答案 1 :(得分:3)

您可以在C ++ 11和C ++ 14中使用类型特征:

#include <type_traits>

if (std::is_same<T, int>::value) {
    std::cout << "vecInt: ";
}
else if (std::is_same<T, double>::value) {
    std::cout << "vecDouble: ";
}

请注意,这是运行时检查,但编译器应该能够对其进行优化。

在C ++ 17中,您可以改为使用if constexpr,这可以保证编译时检查而不会产生运行时开销,并且您还可以使用_v版本的is_same为了不必每次都写::value

if constexpr (std::is_same_v<T, int>) {
    std::cout << "vecInt: ";
}
else if constexpr (std::is_same_v<T, double>) {
    std::cout << "vecDouble: ";
}

然而,实际上,即使是前一版本也应该没有运行时检查,因为编译器会优化分支,因为if子句是编译时常量表达式。在每个模板专门化中,编译器可以看到其中一个分支永远不会被占用,因此将删除分支。