[英]about using template trait in c++ to select data type
我正在學習c ++模板,並希望應用所謂的模板特征來選擇數據類型。 我在網上找到一些代碼並使其適用於我的案例
#include <iostream>
using namespace std;
template <bool T> struct TM;
template <> struct TM<true> {typedef double MType;};
template <> struct TM<false> {typedef int MType;};
int main(int argc, char *argv[])
{
TM<true>::MType x;
TM<false>::MType y;
cout << sizeof(x) << endl;
cout << sizeof(y) << endl;
return 0;
}
它的效果非常好。 但是,似乎這只適用於常量布爾而不是變量,因此以下代碼不起作用
#include <iostream>
using namespace std;
template <bool T> struct TM;
template <> struct TM<true> {typedef double MType;};
template <> struct TM<false> {typedef int MType;};
int main(int argc, char *argv[])
{
bool var=true;
TM<var>::MType w;
if (var) TM<true>::MType z;
else TM<false>::MType z;
cout << sizeof(w) << endl;
cout << sizeof(z) << endl;
return 0;
}
那么模板特征是否適用於運行時定義的變量呢? 謝謝
在C ++中,編譯器從模板中為所有使用的模板參數創建源代碼。 這是在編譯期間完成的。 然后編譯創建的源代碼,就好像它是常規源代碼一樣。
因此,在您的情況下, TM<true>
和TM<false>
被視為完全不同的類型。 如果您編寫類似TM<var>::MType
的內容,編譯器無法找出它是哪兩種類型,因為在運行時之前信息將不可用。
從cppreference :
類型特征定義了一個基於編譯時模板的接口,用於查詢或修改類型的屬性。
在您的情況下, TM<true>
和TM<false
被視為兩種不同的類型。 TM<var>::MType
不會讓編譯器推斷出類型。 它只能在運行時使用,這是不正確的。 編譯器如何推導出兩種類型中的哪一種呢?
從標准:
20.9元編程和類型特征[meta]
本小節描述了C ++程序使用的組件,特別是在模板中,支持最廣泛的類型,優化模板代碼使用,檢測類型相關的用戶錯誤,以及在編譯時執行類型推斷和轉換。 [...]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.