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



嗨,伙计们,也许你可以帮我解决这个问题,

我有两个向量(vecInt,vecDouble)。显然,一个是整数,另一个是双精度

。但是我如何在 if 和 else if 中检查这些向量的类型呢?

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

但是我如何在 if 和 else if 中检查这些向量的类型呢?

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

它看起来像这样:

#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;
}

这确实输出

vecInt: 1 2 3 

正如你所看到的直播。重载的一个主要好处是,您可以在不修改output的情况下扩展它的行为。只需为另一种矢量类型添加重载即可。

顺便说一下,考虑放弃通过指针传递,并按引用传递,就像在惯用C++中一样。

您可以在 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 子句是编译时常量表达式。在每个模板专用化中,编译器可以看到其中一个分支永远不能被采用,因此将删除该分支。

最新更新