我想知道如何使用可变参数模板编写类似Boost MPL的 vector_c 。我已经编写了以下代码片段:
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>
。_ 这可能吗?