2017-02-02 8 views
10

返り値の型をstd::beginとして一般的な方法で取得したいと考えています。私の現在の解決策は:C配列の戻り値の型を取得する

using type = decltype(std::begin(std::declval<T>())); 

です。T = std::vector<int>のときに動作します。次が動作しない理由しかし、私は理解していない:

using type = decltype(std::begin(std::declval<int[3]>())); 

を私はエラーを取得:

example.cpp:83:60: error: no matching function for call to ‘begin(int [3])’ 
    using type = decltype(std::begin(std::declval<int[3]>())); 

一般的な方法でstd::beginの戻り値の型を取得する方法は? arraysため

答えて

7

過負荷がある:

template< class T, std::size_t N > 
constexpr T* begin(T (&array)[N]); 

そしてstd::declval<int[3]>()はあなたにその過負荷と一致しないint(&&)[3]を与えます。 c.begin()のSFINAE-edであるため、通常のコンテナの過負荷にも一致しません。だから、あなたは一致する機能が残っています。

代わりに、左辺の配列への参照をbegin()に渡して、イテレータを戻します。

template <class T> 
using type = decltype(std::begin(std::declval<T>())); 

using arr = type<int(&)[3]>; // int* 

またはエイリアス自体があなたのための左辺値参照を提供してい::手動で、あなたのエイリアスを使用する際の基準を左辺値その提供する必要があるので、どちらか

template <class T> 
using type = decltype(std::begin(std::declval<T&>())); 

using arr = type<int[3]>; // int* 

前者は私にもっと正しいようですしかし、YMMV。

関連する問題