2012-10-06 88 views
0

我有一個與整數模板類(即:模板專門構造函數N個參數

template </*...*/, int a> /*...*/ 

)。在我的課堂上,我想要一個完全採用「a」參數的構造函數。我當然可以使它可變,但如果可能的話,我希望編譯時檢查長度。我也認爲宏黑客可以工作,但我首先尋找內置的C++功能。

在C++中這是可能的,以及它如何如果這樣做呢?

+0

你可以與'的sizeof長度編譯時檢查...'。 http://c-faq.com/decl/spiral.anderson.html:因爲只有正確的語法發揮出來,這充分的心理記憶 – chris

回答

2

用相同類型的值的序列處理是什麼陣列對於。

你甚至都不需要使用原始陣列;使用C++ 11,您可以使用std::array

E.g.像這樣:

template< int a > 
class MyClass 
{ 
public: 
    MyClass(std::array< int, a > const& args) 
    {} 
}; 

如果你的編譯器不提供std::array那麼你可以很容易定義相應的類,或者你可以使用原始陣列:

template< int a > 
class MyClass 
{ 
public: 
    MyClass(int const (&args)[a]) 
    {} 
}; 

嗯,我希望我有在那裏修正&的位置。由於某些我無法理解的原因,我總是忘記語法。不管我用了多少次。


鑑於OP中的評價是(1)他沒有C++ 11和(2)他想簡單的聲明語法

MyClass<4> m(0,1,2,3); 

一種可能性是澄清使MyClass可以由C++ 03大括號初始化,即,沒有用戶定義的構造進行初始化的集合體:

#include <stddef.h> 

typedef ptrdiff_t Size; 
typedef Size Index; 

template< Size a > 
class MyClass 
{ 
public: 
    static Size const n = a; 
    static Size size() { return n; } 

    int elems_[n]; 
    int operator[](Index const i) const { return elems_[i]; } 
    int& operator[](Index const i) { return elems_[i]; } 
}; 

#include <iostream> 
using namespace std; 
int main() 
{ 
    MyClass<3> x = {100, 200, 300}; 
    for(int i = 0; i < x.size(); ++i) 
    { 
     wcout << x[i] << endl; 
    } 
} 

如果該溶膠這是可以接受的,那麼它實質上就是重新實現std::array

+1

我永遠不會忘記的語法。如果你還沒有看到或仔細看過它,我希望你能做到,我希望它有幫助。 – chris

+1

std :: array不可用。對於第二個,它看起來正是我想要的,但是我很難定義它。這個螺旋式的技巧看起來很酷,但我甚至不確定上述(完全)在做什麼?要清楚,我希望能夠做到像「MyClass <4> m(0,1,2,3);」這樣的內容。謝謝, – imallett

+0

@IanMallett:給出的代碼原來有'&'正確放置,所以沒關係。它只涵蓋你關於*功能*的原始問題。你現在問的是關於*創建語法*,這需要更復雜的解決方案(你有C++ 11直接方便的語法,但因爲你沒有'的std :: array'你沒有Ç ++ 11)。人們只是爲了很好的理由才創建語法,例如在提升組件意味着被重複使用數十億次。即使如此,對於客戶端代碼編程人員來說也很難涉及到。 –