为实例化模板创建别名

时间:2010-11-16 17:06:21

标签: c++ templates

我最初有许多信号处理过滤器类,除了定义过滤器特性的几个常量外,它们是相同的,因此我决定将这些更改为模板类以实现可维护性和可扩展性。在这种情况下,有一些性能和内存管理原因可以优先使用模板而不是构造函数参数。它适用于嵌入式系统。

因此我有一个表格的模板类:

template <int SIZE, int SCALE_MULTIPLIER, int SCALE_SHIFT>
class cBoxcarFilter
{
public:
    // Allow access to SIZE at runtime.
    static const int FILTER_SIZE = SIZE ;
    ...
}

我明确地实例化了这一点,例如:

template class cBoxcarFilter<8, 1, 3>

问题是当我需要访问它需要的FILTER_SIZE成员时:

cBoxcarFilter<8, 1, 3>::FILTER_SIZE

这使得访问FILTER_SIZE变得多余,因为它必须在参数中重复。我对这个问题的解决方案是:

// Create an alias for filter
#define cSpecialistBoxcarFilter cBoxcarFilter<8, 1, 3>
template class cSpecialistBoxcarFilter ;

然后我可以访问FILTER_SIZE:

cSpecialistBoxcarFilter::FILTER_SIZE

这也具有每个过滤器实例的有意义的唯一名称的优点,就像在原始的非模板化版本中一样,但是使用看起来像类的宏看起来有点臭,因为它具有不同的范围语义。

是否有更好的方法为模板实例创建别名类名?

2 个答案:

答案 0 :(得分:10)

是的,typedef

typedef cBoxcarFilter<8, 1, 3> cSpecialistBoxcarFilter;

答案 1 :(得分:0)

您可以询问类的具体实例(对象)的过滤器大小:

template <int X> class A
{
  public:
  int y;
  static const int size = X;
};

int main(int, char**)
{
  A<3> a;
  printf("size is %i\n", a.size);
}

结果

size is 3