8

C++98 では、通常、イテレータの値の型で変数を宣言するために次のように使用します。

typename std::iterator_traits<Iterator>::value_type value;

C++11 には decltype があり、値の型を推測する最も簡単な方法は次のとおりだと思いました。

decltype(*iterator) value;

残念なことに、ほとんどの反復子にとって、*iterator の型は value_type& であり、value_type ではありません。型変更クラスなしで、上記をマッサージして value_type (参照ではなく) を生成する方法はありますか?


以下はかなり堅牢ですが、最終的に別の変数を作成することを考えると、この質問は不合理だとは思いません。

auto x = *iterator;
decltype(x) value;

また、これらの値の std::vector を宣言したい場合など、インスタンスだけでなく、推定された型が本当に必要であることにも注意してください。

4

2 に答える 2

17

使い続けるiterator_traitsdecltype(*iterator)式で特別なことを行うために、ある種の奇妙なプロキシ クラスになることさえあります*iter = something

例:

#include <iostream>
#include <iterator>
#include <typeinfo>
#include <vector>

template <typename T>
void print_type()
{
    std::cout << typeid(T).name() << std::endl;
}

template <typename Iterator>
void test(Iterator iter)
{
    typedef typename
        std::iterator_traits<Iterator>::value_type iter_traits_value;

    auto x = *iter;
    typedef decltype(x) custom_value;

    print_type<iter_traits_value>();
    print_type<custom_value>();
}

int main()
{
    std::vector<int> a;
    std::vector<bool> b;

    test(a.begin());
    test(b.begin());
}

MSVC 2012 での出力:

int
int
bool
class std::_Vb_reference<struct std::_Wrap_alloc<class std::allocator<unsigned int>>>

それらは同じではありません。

于 2013-03-22T01:02:19.430 に答える