可変テンプレートを使用してBoost MPLのようなvector_cをどのように書くのだろうと思います。あなたはvector
がそれに少なくとも一つの要素を持たなければならないことに気づくかもしれませんが、それは本当に私のための制限ではありません可変テンプレートを使用したMPLのようなベクター:挿入
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;
}
};
:私はすでに次のコードスニペットを書きました。上記の定義によれば、所与のインデックスの要素にアクセスするための「機能」を書くことは非常に容易である:例えば
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
を返します。今私の質問:1つは、挿入機能を実装するだろうか? MPLを使用していないのは、insert<>
を試したときにvector_c
が返されなかったからです。具体的には、挿入は次のように適用されるべきである:
insert<vector<1, 3, 4>, 1, 2>::type
// ^ ^^
// type at element
必須収率vector<1, 2, 3, 4>
。それは可能ですか?
すてきな解決策 - MPLをどのようにしてバラエティに富んだテンプレートに書き直し/置き換えることができるかの洞察を得るのに役立ちます。 – mark
その間に、私は 'push_front'関数を書く必要があるという結論に達しました - しかし、私はそれがベクトルそのものの中になければならないことを認識しませんでした!私は、ベクトルクラスの外でpush_frontを書くことは不可能だと思います。 – cschwan
@cschwan:もちろん*できます*(例:http://ideone.com/3F4UQ)。私はちょっと気にしないでください。 – kennytm