模板专业化问题

时间:2009-11-02 20:20:19

标签: c++ visual-studio-2008 templates metaprogramming specialization

我正在努力做到这一点,但我没有运气。我确信有一个解决方法,但我还没有碰到它。好吧,让我们看看我是否可以简单地描述问题和需求:

我有一个RGB模板类,可以将类型名作为其模板参数之一。它接受typename并将其发送到另一个模板,该模板创建其基本类型的分类。例如:

struct float_type {};
struct bit_type {};
struct fixed_pt_type {};

template <typename T> struct type_specification { typedef float_type type; };

template <> struct type_specification<char>      { typedef bit_type type; };
template <> struct type_specification<short>     { typedef bit_type type; };
template <> struct type_specification<int>       { typedef bit_type type; };
template <> struct type_specification<long>      { typedef bit_type type; };
template <> struct type_specification<long long> { typedef bit_type type; };

然后,我有一个模板,根据其位数计算每个RGB值的最大值:

template <int Bits, typename T> struct Max_Values { enum { MaxValue = (1 << Bits) - 1; }; };
template <int Bits> struct MaxValues<float_type>  { enum { MaxValue = 1.0; }; };

然后在实际的RGB模板类中,我有:

enum
{
     RMax = Max_Values<RBits, type_specification<T>::type>::MaxValue;
     GMax = Max_Values<GBits, type_specification<T>::type>::MaxValue;
     BMax = Max_Values<BBits, type_specification<T>::type>::MaxValue;
};

这对我来说非常有效,直到我进入固定pt需求。最大值有点不同,我不知道如何创建一个类型规范专门化来隔离它。我唯一的工作是消除和创建浮点数和双精度的特殊化过程,并假设一般情况将是固定的 - pt。但必须有更好的方法来做到这一点。这是我想用错误的代码做的事情:

template <> struct type_specification<fixed_pt_t> { typedef fixed_pt_type type; };

但是,fixed-pt-t是一个模板类,如下所示:

template <int N, typename T, template <class> class Policy> struct fixed_pt_t

因此编译器不喜欢没有模板参数的专业化 有没有办法专门化我的类型规范类来使用fixed-pt-t?
它适用于一般情况,只是无法隔离它。

1 个答案:

答案 0 :(得分:3)

也许我错过了一些更大的并发症,但是你有什么理由不能仅仅部分专门化type_specification模板吗?

这样的事情:

template <int N, typename T, template <class> class Policy>
struct type_specification< fixed_pt_t<N, T, Policy> >
{
    typedef fixed_pt_type type;
};