簡體   English   中英

如何確定傳遞給模板函數的向量的類型

[英]How to determine the type of a passed vector to a template function

嗨,大家也許可以幫我一下

我有兩個向量(vecInt,vecDouble)。 顯然,一個是int類型,另一個是double類型。

但是,如何在if和else if中檢查這些向量的類型?

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

但是,如何在if和else if中檢查這些向量的類型?

你不知道 那並不是說你不能,只是說你不應該。 這種分支不會為您提供所需的解決方案,十分之九。 過載是一個更好的選擇。 無需添加分支,而是添加對輔助函數的調用,然后您可以重載該調用以獲取所需的行為。

它看起來像這樣:

#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 ,這可以確保在沒有運行時開銷的情況下進行編譯時檢查,並且還可以使用is_same_v版本以便不必每次都編寫::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子句是編譯時常量表達式。 在每種模板專門化中,編譯器都可以看到某個分支永遠不會被采用,因此將刪除該分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM