6

std::back_insert_iteratorvalue_type等しいですが、基になる へのポインターを保持するメンバーvoidも持っています。次の行に沿って、コンテナの を抽出する特性クラスを作成しようとしています。protectedcontainerContainervalue_type

#include <iterator>
#include <type_traits>
#include <vector>

template<class OutputIt>
struct outit_vt
:
    OutputIt
{
    using self_type = outit_vt<OutputIt>;
    using value_type = typename std::remove_pointer_t<decltype(std::declval<self_type>().container)>::value_type;
};

int main()
{
    std::vector<int> v;
    auto it = std::back_inserter(v);
    static_assert(std::is_same<outit_vt<decltype(it)>::value_type, int>::value, "");
}

実際の例

ただし、これは (多かれ少なかれ予想通り) 不完全型エラーに遭遇します。コンテナのを抽出するために、この周りにとにかくありますvalue_typeか?

4

2 に答える 2

2

あなたはそれが持っていることを使うことができますcontainer_type:

#include <iterator>
#include <type_traits>
#include <vector>

template<typename T>
struct outit_v {
    using container_type = typename T::container_type;
    using value_type = typename container_type::value_type;
};

int main()
{
    std::vector<int> v;
    auto it = std::back_inserter(v);
    static_assert(std::is_same<outit_v<decltype(it)>::value_type, int>::value, "");
}

実際の例

于 2015-03-15T20:28:12.127 に答える