簡體   English   中英

關於在c ++中使用模板特征來選擇數據類型

[英]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.

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