C++ 如何在不复制和粘贴整个类主体的情况下专门化模板?

C++ 如何在不复制和粘贴整个类主体的情况下专门化模板?,c++,templates,template-specialization,C++,Templates,Template Specialization,我为移动平均值编写了一个简单的类,可以与AVR一起使用 template<typename T, typename Tsum = int32_t> class MovingAverage { ... } 模板 类移动平均值{…} 但是现在我想专门化这个float类,而不复制和粘贴整个类主体,并将所有T和Tsum更改为float,并且不需要使用两个模板参数。Tsum是“sum”变量的类型,其中T类型的所有传递值都被求和。如果T是'uint8_T',最好对求和使用'uint32_T'

我为移动平均值编写了一个简单的类,可以与AVR一起使用

template<typename T, typename Tsum = int32_t>
class MovingAverage { ... }
模板
类移动平均值{…}
但是现在我想专门化这个float类,而不复制和粘贴整个类主体,并将所有T和Tsum更改为float,并且不需要使用两个模板参数。Tsum是“sum”变量的类型,其中T类型的所有传递值都被求和。如果T是'uint8_T',最好对求和使用'uint32_T',但对于float或double,不需要使用精度更高的数据类型,因此我只需要一个参数。我认为它可以这样工作:

typedef MovingAverage<float, float> MovingAverage<float>
template<>
class MovingAverage<float> : public MovingAverage<float, float> {};
typedef移动平均值移动平均值
或者这样:

typedef MovingAverage<float, float> MovingAverage<float>
template<>
class MovingAverage<float> : public MovingAverage<float, float> {};
模板
类移动平均数:公共移动平均数{};
但我错了,我找到了唯一需要写两次代码的解决方案

有没有办法只编写一次类,然后以我喜欢的方式专门化它?
提前谢谢

您可以编写一个简单的traits类

// general version
template<typename T>
struct sum_type
{
    typedef int32_t type;
};

// specialized version
template<>
struct sum_type<float>
{
    typedef float type;
};

// repeat for double, the solution from @DanielFrey is even more sophisticated 
// as it specializes all floating point types in one sweep.
//通用版本
模板
结构和类型
{
typedef int32_t type;
};
//专用版本
模板
结构和类型
{
typedef浮点型;
};
//重复double,来自@DanielFrey的解决方案更加复杂
//因为它在一次扫描中专门处理所有浮点类型。
然后在类模板中提取此类型

template<typename T, typename Tsum = typename sum_type<T>::type>
//                                   ^^^^^^^^ <-- dependent type disambiguation
class MovingAverage { ... };
模板

//^^^^^^如果您希望为
Tsum
使用不同的默认类型,则应将其外包给另一个可以指定的类,例如:

template< typename, typename = void >
struct DefaultSum { using type = int32_t; };

template< typename T >
struct DefaultSum< T, typename std::enable_if<
  std::is_floating_point< T >::value
>::type >
{ using type = T; };

template<typename T, typename Tsum = typename DefaultSum<T>::type >
class MovingAverage { ... }
template
结构DefaultSum{using type=int32_t;};
模板
结构DefaultSum::值
>::类型>
{使用type=T;};
模板
类移动平均值{…}

@DanielFrey这本书读起来也很不错,很有教育意义,等不及C++11版本了。谢谢你,@Daniel!这真的很好,与gcc完美配合。不幸的是,我发现我还没有为AVRCC安装boosts type_traits版本。目前,我正在谷歌搜索一个可安装的debian软件包,以使其正常工作。否则,我会将x86_64安装中所需的部分复制到avr gcc的include目录中。