如何创建依赖模板的成员类型 我试图减少和简化一些嵌套的、过于专门化的模板C++代码。为此,我希望能够声明成员类型,它依赖于函数或类实例化时使用的模板类型

如何创建依赖模板的成员类型 我试图减少和简化一些嵌套的、过于专门化的模板C++代码。为此,我希望能够声明成员类型,它依赖于函数或类实例化时使用的模板类型,c++,templates,c++03,C++,Templates,C++03,以下面的泛型类模板作为结果模板专门化。“a”的类型取决于实例化类型 template <typename Float> class A; template <> class A<double> { double a; } }; template <> class A<float> { float a; } }; template <&g

以下面的泛型类模板作为结果模板专门化。“a”的类型取决于实例化类型

  template <typename Float> class A;

  template <>
    class A<double> {  
      double a;
    }
  };

  template <>
    class A<float> {  
      float a;
    }
  };


  template <>
    class A<short> {  
      float a;
    }
  };
A类模板;
模板
A类{
双a;
}
};
模板
A类{
浮动a;
}
};
模板
A类{
浮动a;
}
};
除了“a”类型之外,这些类都是相同的,即模板类型到double->double、float->float和short->float类型的映射。有没有一种方法可以简单地封装这个映射,只允许编写一次类

我想我很想写下面这样的东西,但我不知道这是否可能

  typedef double Float2<double>;
  typedef float Float2<float>;
  typedef float Float2<short>;

  template <typename Float>
    class A {  
      Float2<Float> a;
    }
  };
typedef双浮点数2;
typedef-Float2;
typedef-Float2;
模板
A类{
2 a;
}
};

注意:我使用的是C++03,因此无法使用C++11(我认为decltype在这里可能有用,但我不确定)。

没有必要使用
decltype
。您只需创建一个类型特征并对其进行专门化,以提供适当的类型映射:

template<typename>
struct mapper;

template<>
struct mapper<double> {
    typedef double type;
};

template<>
struct mapper<float> {
    typedef float type;
};

template<>
struct mapper<short> {
    typedef float type;
};

template <typename Float> 
class A {
    typedef typename mapper<Float>::type float_type;

    float_type a;
};
模板
结构映射器;
模板
结构映射器{
typedef双字型;
};
模板
结构映射器{
typedef浮点型;
};
模板
结构映射器{
typedef浮点型;
};
模板
甲级{
typedef typename映射器::type float_type;
a型浮球;
};

谢谢。完美的解决方案。这里是Dobbs Journal博士的Boost库中的C++特性和模板使用的写法,这里有一篇略微不同的文章,尽管有一些书面的英文问题补充,多布斯博士的文章有一个新的有用的模板技术和特性:如果是,则是其他类型的模板技术。