代码之家  ›  专栏  ›  技术社区  ›  Clifford

为实例化模板创建别名

  •  1
  • Clifford  · 技术社区  · 14 年前

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

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

    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>
    

    问题是当我需要访问筛选器大小成员时,它需要:

    cBoxcarFilter<8, 1, 3>::FILTER_SIZE
    

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

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

    然后我可以访问筛选器大小,从而:

    cSpecialistBoxcarFilter::FILTER_SIZE
    

    与原始的非模板版本一样,这还有一个优点,即每个过滤器实例的名称都是有意义的唯一名称,但对于我来说,使用一个看起来像类的宏似乎有点难闻,因为它具有不同的作用域语义。

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

    2 回复  |  直到 14 年前
        1
  •  10
  •   Oliver Charlesworth    14 年前

    对, typedef !

    typedef cBoxcarFilter<8, 1, 3> cSpecialistBoxcarFilter;
    
        2
  •  0
  •   Alex Brown    14 年前

    可以向类的具体实例(对象)询问其筛选器大小:

    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