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编译器之类的东西,则无法找出这两种类型中的哪一种,因为在运行前信息将不可用。

于 2013-08-06T06:06:44.403 回答
2

cppreference

类型特征定义了一个基于编译时模板的接口来查询或修改类型的属性。

在您的情况下,TM<true>并被TM<false视为两种不同的类型。TM<var>::MType不会让编译器推断类型。它只会在运行时可用,这是不正确的。编译器如何推断出这两种类型中的哪一种?


从标准:

20.9 元编程和类型特征[元]

本小节描述了 C++ 程序使用的组件,尤其是在模板中,以支持尽可能广泛的类型、优化模板代码的使用、检测与类型相关的用户错误,以及在编译时执行类型推断和转换。[...]

于 2013-08-06T06:11:22.230 回答