缩小 C++ 模板代码上的样板代码
minifying boilerplate code on C++ template code
假设我有这样的代码:
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,因此可以将其编译到目标文件中,而不是每次都重新编译(这是编译器相关的,可以是也可以不是) .
其次,您还需要输入template <class T> int Something<T>::func2()
。
有没有办法简化样板代码?
面向对象编程来帮你!使 Something<T>
继承自未模板化的 class 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;
}
In this case Something::func2() does not really depends of template
parameter T, so it can be compiled into the object file, instead of
recompiled every time (this is compiler dependent and can or can not
be true).
没有。 func2是class的方法,由于Something<int>
和Something<double>
是两个不同的class,所以应该编译它们的代码。
你可以做的是从class中提取方法到一个单独的方法或一个基础class,但总的来说,我认为你不应该那样做。
假设我有这样的代码:
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,因此可以将其编译到目标文件中,而不是每次都重新编译(这是编译器相关的,可以是也可以不是) .
其次,您还需要输入template <class T> int Something<T>::func2()
。
有没有办法简化样板代码?
面向对象编程来帮你!使 Something<T>
继承自未模板化的 class 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;
}
In this case Something::func2() does not really depends of template parameter T, so it can be compiled into the object file, instead of recompiled every time (this is compiler dependent and can or can not be true).
没有。 func2是class的方法,由于Something<int>
和Something<double>
是两个不同的class,所以应该编译它们的代码。
你可以做的是从class中提取方法到一个单独的方法或一个基础class,但总的来说,我认为你不应该那样做。