大模板 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
.
我有大型模板 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
.