2015-01-16 46 views
2

好吧,我關於模板的上一個問題的更新(我在這個領域是一個小菜鳥)... 我把我的大部分問題都恢復到: 是否有可能有不同的參數計算一個成員函數,取決於類聲明中使用的模板參數?模板專業化功能參數計數

例如,一個構造函數:

template <typename Type, unsigned ElementCount> 
class TVector 
    { 
    public: 
    Type Values[ElementCount]; 

    TVector (ElementCount number of Type here) 
     { ... 

這可能嗎? 或許二傳手:

SetValues (ElementCount number of Type here); 

編輯: 好了,我的錯,我沒有完全解釋。 這個矢量是一個三角矢量,而不是一個元素數組。所以它應該支持2,3或4個值。至於構造函數,我希望能夠做到這樣的事情: TVector xpto(0.0f,0.0f,0.0f,1.0f);至於編譯器,我使用的是gcc,並且不知道是否可以安全地啓用更新的C++標準。它確實抱怨,當我啓用它們。所以,對我來說沒有enable_if :)

謝謝。

+3

你基本上正在['std :: array'](http://en.cppreference.com/w/cpp/container/array)。它是一個聚合類型,所以可以使用聚合初始化。你可以這樣做,或者沒有理由讓你的構造函數不能使用'std :: initializer_list'或其他容器。 –

+0

我的意思是在2D,3D或4D矢量中的矢量。代數。 –

+0

@RhiakathFlanders:你仍然可以爲許多函數委託std :: array,包括這個。只需將它作爲您的唯一數據成員(公共),並且不要自己定義任何構造函數/ etc。這應該足夠了。 – Puppy

回答

0

成員函數可以具有參數a std::initializer_list<T>類型,該類型允許其訪問任意數量的類型爲const T的對象。在這種情況下,可以刪除類模板中的ElemCount,因爲您不必指定參數數量。

template <typename Type> 
class TVector 
    { 
    public:  

    TVector (std::initializer_list<Type> l) 
     { ... 
+0

他確實需要它作爲內部陣列。 – Puppy

+0

,這需要我啓用C++ 11,這是我試圖避免的......我開始認爲我想要的大部分是可能的,只有當我堅持擴展或更新的標準,而不是標準的c99。 GCC抱怨說,對C++ 11的支持仍然是實驗性的,所以...... –

+0

另外,我在幾個地方看到避免將用C++ 99編譯的lib與用C++ 11編譯的庫鏈接起來。正如我鏈接到其他庫,這可能是一個問題.. –

0

是的,你可以使用std::enable_if

如果你沒有C++ 14,你還需要添加

template< bool B, class T = void > 
using enable_if_t = typename enable_if<B,T>::type; 

由於JosephMansfield在評論中所指出的,一個簡單的解決方案可能是隻接受std::array<Type, ElementCount>

+0

具有4個參數的構造函數將接受所有大小的三角矢量。 只需將參數值初始化爲零即可。 'TVector(T T1 =(T)0,T T2 =(T)0,T T3 =(T)0,T T4 =(T)0){\t }' 忽略在計算中零當三角矢量小於4時。 – dspfnder