您可以使用型性狀的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: ";
}
然而在實踐中,即使是前一版本應該結束了,沒有運行時檢查,因爲編譯器將優化掉的樹枝,因爲如果條款是編譯時常量表達式。在每個模板專業化中,編譯器都可以看到其中一個分支永遠不會被佔用,因此會刪除該分支。
模板的重點在於避免必須知道類型。你可以不打印矢量類型* *在調用模板函數之前,你仍然知道類型? – Galik
的確如此。我現在正在做這件事,現在我意識到模板功能絕對不是正確的地方。我將編輯我的問題到更一般的方法。 – Kai
你的編輯不會改變這個問題,它只是讓我的答案看起來像我憑空製作的東西。 – StoryTeller