假设我有这样的代码:
template <class T>
class Something{
public:
int func1();
int func2();
T t;
int n = 0;
};
template <class T>
int Something<T>::func1(){
return t.value() * n;
}
template <class T>
int Something<T>::func2(){
return n;
}
在这种情况下,Something::func2()
并不真正依赖于模板参数T,因此可以将其编译到目标文件中,而不是每次都重新编译(这取决于编译器,可以或不可以)。 / p>
其次,您仍然需要输入template <class T> int Something<T>::func2()
。
有没有办法简化样板代码?
答案 0 :(得分:2)
在这种情况下,Something :: func2()并不真正依赖于模板 参数T,因此它可以编译到目标文件中,而不是 每次都重新编译(这取决于编译器,可以或不可以 是真的。)
没有。 func2是一个类的方法,由于Something<int>
和Something<double>
是两个不同的类,因此应该编译它们的代码。
你可以做的是从类中提取方法,到单独的方法或基类,但总的来说,我认为你不应该这样做。
答案 1 :(得分:0)
面向对象编程随时为您提供帮助!让Something<T>
继承自未实现的类SomethingBase
:
#include <iostream>
struct SomethingBase
{
int un_templatized();
};
int SomethingBase::un_templatized()
{
return 42;
}
template <class T>
struct Something : SomethingBase
{
T templetized(T t)
{
return t;
}
};
int main()
{
Something<double> s;
std::cout << s.un_templatized() << std::endl;
std::cout << s.templetized(3.14) << std::endl;
}