大家好,也许你可以帮我解决这个问题,
我有两个向量(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: ";
}
答案 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子句是编译时常量表达式。在每个模板专门化中,编译器可以看到其中一个分支永远不会被占用,因此将删除分支。