嗨,伙计们,也许你可以帮我解决这个问题,
我有两个向量(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 子句是编译时常量表达式。在每个模板专用化中,编译器可以看到其中一个分支永远不能被采用,因此将删除该分支。