我想知道如何使用可變參數模板來編寫類似Boost MPL的vector_c。我已經寫了下面的代碼片段:MPL-like vector with variadic templates:Insertion
template <std::size_t element, std::size_t ... E>
struct vector
{
typedef vector<E ...> next;
static constexpr std::size_t size()
{
return sizeof... (E);
}
static constexpr std::size_t value()
{
return element;
}
};
template <std::size_t element>
struct vector<element>
{
// no need to define 'next' here
static constexpr std::size_t size()
{
return 1;
}
static constexpr std::size_t value()
{
return element;
}
};
您可能注意到,vector
必須在其中至少有一個元素,但是這是不是真的對我的限制。與上面的定義,它是很容易寫「功能」,用於訪問一個給定索引的元素:
template <std::size_t index, typename T>
struct get
{
typedef typename get<index - 1, typename T::next>::type type;
};
template <typename T>
struct get<0, T>
{
typedef T type;
};
例如,get<1, vector<1, 2, 3>>
返回正確的結果2
。現在我的問題:如何實現插入功能?我不使用MPL的原因是,當我嘗試它的insert<>
時,它沒有返回vector_c
。特別地,插入應適用這樣的:
insert<vector<1, 3, 4>, 1, 2>::type
// ^ ^^
// type at element
其中必須收率vector<1, 2, 3, 4>
。那可能嗎?
不錯的解決方案 - 它有助於瞭解如何大量提升MPL可以重寫或用可變參數模板取代。 – mark 2012-03-06 21:05:33
與此同時,我也得出結論,我必須寫一個'push_front'函數 - 但是,我沒有意識到它必須位於vector本身內部!我認爲在矢量類之外編寫push_front是不可能的,對吧? – cschwan 2012-03-07 09:47:35
@cschwan:當然你*可以*(例如:http://ideone.com/3F4UQ)。我只是不打算這麼做。 – kennytm 2012-03-07 10:08:32