我正在尝试减少并简化一些可怕的嵌套和过度专用的模板化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的类型的映射&gt; double,float-&gt; float和short-&gt; 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可能在这里使用,但我不确定)。
答案 0 :(得分:8)
无需使用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;
};