Мне интересно, как можно написать 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>
. Это возможно?