2016-03-08 68 views
3

假設我有這樣的代碼:對C++模板代碼涅槃樣板代碼

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

有沒有簡化樣板代碼的方法?

+4

將代碼推入基類中? – Nim

+1

添加一個非模板基類,並在其中移動func1()和func2()。 – Jojje

+0

我想過一些關於疙瘩的... – Nick

回答

2

在這種情況下的東西:: FUNC2()並不真正依賴模板 參數T的,因此它可以被編譯成目標文件,而不是每次重新編譯 (這是編譯器相關的,可以或不可以 爲真)。

號FUNC2是類的一個方法,並且由於Something<int>Something<double>是兩個不同的類,它們的代碼應被編譯。

你可以做的是從類中提取方法,以單獨的方法或基類,但總的來說,我認爲你不應該那樣做。

0

面向對象編程在這裏可以幫助您!請從untempletized類SomethingBaseSomething<T>繼承:

#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

+0

'un_templatized'現在返回'42'而不是'Something :: n',這似乎是這個解決方案的一個重大限制。 – nwp

+1

@nwp這只是一個簡單的例子,沒有任何東西禁止'SomethingBase'包含'int'屬性。 – YSC