我有一個與整數模板類(即:模板專門構造函數N個參數
template </*...*/, int a> /*...*/
)。在我的課堂上,我想要一個完全採用「a」參數的構造函數。我當然可以使它可變,但如果可能的話,我希望編譯時檢查長度。我也認爲宏黑客可以工作,但我首先尋找內置的C++功能。
在C++中這是可能的,以及它如何如果這樣做呢?
我有一個與整數模板類(即:模板專門構造函數N個參數
template </*...*/, int a> /*...*/
)。在我的課堂上,我想要一個完全採用「a」參數的構造函數。我當然可以使它可變,但如果可能的話,我希望編譯時檢查長度。我也認爲宏黑客可以工作,但我首先尋找內置的C++功能。
在C++中這是可能的,以及它如何如果這樣做呢?
用相同類型的值的序列處理是什麼陣列對於。
你甚至都不需要使用原始陣列;使用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
。
我永遠不會忘記的語法。如果你還沒有看到或仔細看過它,我希望你能做到,我希望它有幫助。 – chris
std :: array不可用。對於第二個,它看起來正是我想要的,但是我很難定義它。這個螺旋式的技巧看起來很酷,但我甚至不確定上述(完全)在做什麼?要清楚,我希望能夠做到像「MyClass <4> m(0,1,2,3);」這樣的內容。謝謝, – imallett
@IanMallett:給出的代碼原來有'&'正確放置,所以沒關係。它只涵蓋你關於*功能*的原始問題。你現在問的是關於*創建語法*,這需要更復雜的解決方案(你有C++ 11直接方便的語法,但因爲你沒有'的std :: array'你沒有Ç ++ 11)。人們只是爲了很好的理由才創建語法,例如在提升組件意味着被重複使用數十億次。即使如此,對於客戶端代碼編程人員來說也很難涉及到。 –
你可以與'的sizeof長度編譯時檢查...'。 http://c-faq.com/decl/spiral.anderson.html:因爲只有正確的語法發揮出來,這充分的心理記憶 – chris