如何创建依赖模板的成员类型

How to create template dependent member type

本文关键字:成员 成员类 类型 依赖 何创建 创建      更新时间:2023-10-16

我正在尝试减少和简化一些可怕的嵌套和过度专门的模板化c++代码。为此,我希望能够声明依赖于实例化函数或类的模板类型的成员类型。

将以下泛型类模板作为结果模板特化。'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'类型,即模板类型到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;
    }
  };

注意我使用的是c++ 03,不能使用c++ 11来实现这个目的(我认为decltype可能在这里有用,但我不确定)

不需要使用decltype。你可以只创建一个类型trait并专门化它来提供适当的类型映射:

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