3

私は 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;
}

テンプレートの特性が実行時に定義された変数で機能しないというのは本当ですか? ありがとう

4

2 に答える 2

4

C++ では、コンパイラはテンプレートから使用されるすべてのテンプレート引数のソース コードを作成します。これはコンパイル中に行われます。作成されたソース コードは、通常のソース コードと同様にコンパイルされます。

したがって、あなたの場合、TM<true>TM<false>はまったく異なるタイプとして扱われます。コンパイラのようなものを書いた場合TM<var>::MType、実行前に情報が利用できないため、コンパイラは2つのタイプのどちらであるかを見つける方法がありません.

于 2013-08-06T06:06:44.403 に答える