不使用模板参数的C ++ Template类方法

时间:2014-11-12 01:23:20

标签: c++ arrays templates parameters

我有一个包含M个方法的类,只有一个方法对std :: array执行只读操作。其余的M-1方法不使用std :: array。代码如下。假设我无法分手。

我担心的是:

  1. 这段代码有点难看,因为如上所述,只有一种方法使用参数N。
  2. 如果我用不同的N来实例化100次Bar,那么代码的膨胀是不是很大?就像我说的,只有一种方法使用参数N,但我的理解是我将获得99 *(M-1)个有效方法的额外副本。
  3. 话虽这么说,使用矢量或C阵列代替避免模板是标准的吗?我会牺牲任何潜在的表现吗?

    //bar.h
    template<int N>
    class Bar
    {
      public:
        Bar(const std::array<Foo, N>& arr);
        void method_one();
        void method_two();
        void method_three();
        ...
      private:
        const std::array<Foo, N> arr_;
    };
    
    template<int N> Bar<N>::Bar(const std::array<Foo, N>& arr) :
      arr_(arr)
      {}
    
    template<int N> void Bar<N>::method_one()
    {
       //....
    }
    
    template<int N> void Bar<N>::method_two()
    {
       //....
    }
    
    //etc
    

2 个答案:

答案 0 :(得分:2)

首先,即使编辑器具有不同的签名,您的编译器也可能(或可能被诱导)折叠相同的功能 这是否合法(以及如何强制),请参见此处:

Do distinct functions have distinct addresses?
Is an implementation allowed to site two identical function definitions at the same address, or not?

接下来,如果模板的成员独立于模板参数,请考虑将它们移动到基类:

class Bar_base {
    // Move everything here not dependent on template-arguments.
    // Can be done multiple times if useful
}
template<int N> class Bar : public Bar_base {
    // Everything dependent on `N`, and maybe some using-declarations
    //  for proper overloading
}

标准库的所有实现都做得很广泛,如果你看一下<iostream>,它甚至可以在标准中编写。

答案 1 :(得分:0)

如果只有构造函数使用std :: array&lt; ...,N&gt;你可以将模板化的类转换为带有模板化构造函数的标准类。还有更多我希望编译器足够聪明,不能复制100个没有依赖N的代码片段。

class Bar
{
  public:
    template<int N>
    Bar(const std::array<Foo, N>& arr);
...
...
}
编辑:废话!!这似乎没有编译......它适用于像

这样的参数
class Bar {
public:
 template<int N>
 Bar(const int (& a)[N]);