大模板 class 样板代码

large template class boilerplate code

我有大型模板 class 以及多种方法等

大多数方法不使用模板参数 - 只有少数方法使用模板参数。

有没有办法减少样板代码?

template <class T>
class Something{
    void method1();
    void method2();
    void method3();
};

template <class T>
void Something<T>::method1(){
    T::use();
}

template <class T>
void Something<T>::method2(){
    // do not use T at all, does not call method1()
}

template <class T>
void Something<T>::method3(){
    // do not use T at all, does not call method1()
}

有什么方法可以避免 template <class T>(在我的真实代码模板定义中要大得多)?

如果只有method1使用模板参数,那么只有那个函数需要模板化。

class Something
{
    template<class T>
    void method1()
    {
        T::use();
    }

    void method2();
    void method3();
};

请注意,这会稍微改变 class 的功能。现在可以在其 method1 上使用多种类型调用一个实例,而之前只能使用一种类型并且必须预先确定。

将不依赖模板的方法放在一个基类中 class。

class SomethingBase
{
protected:
  void method2();
  void method3();
};

template<typename T>
class Something
: SomethingBase
{
public:
  void method1();
  using SomethingBase::method2;
  using SomethingBase::method3;
};

这不会改变 class 的功能,但比 Neil Kirk 的方法更麻烦一些,如果适用,应该首选后者。

如果像这里一样,基类的唯一功能是为派生的 classes 提供不太专业的功能,那么它的所有成员,包括构造函数,都应该是 protected.