缩小C ++模板代码

时间:2016-03-08 13:56:55

标签: c++ templates dry

假设我有这样的代码:

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()

有没有办法简化样板代码?

2 个答案:

答案 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;
}

Demo