2017-02-02 61 views
10

Genel bir şekilde std::begin dönüş türünü almak istiyorum. Benim şu anki çözümüm:Bir c dizisinde başlamanın dönüş türünü döndürme

ve T = std::vector<int> olduğunda çalışır.

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

Nasıl genel bir şekilde std::begin dönüş türünü almak için:

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

hata alıyorum: Aşağıdaki çalışmıyor Ama neden anlamıyorum? arrays için

cevap

7

aşırı geçerli:

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

Ve std::declval<int[3]>() sana bu aşırı uymayan bir int(&&)[3] verir. Aynı zamanda normal kapsayıcı aşırı yüklenmeyle de eşleşmiyor, çünkü bunlar c.begin()'a sahip olmada SFINAE-ed. Yani eşleştirme fonksiyonu kalmadı.

Bunun yerine, yineleyici geri almak için lvalue başvuru dizisini begin() dizisine geçirmek gerekir.

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

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

veya kendisi sizin için lvalue referans sağlamak takma adına sahip: Yani, ya elle size takma kullandığınızda başvuru lvalue bir sağlamanız gerekir

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

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

eski benim için daha doğru görünüyor ama YMMV.

İlgili konular