2016-05-24 10 views
14

में किसी सरणी के एक तत्व के किसी प्रकार को कम करने का कोई तरीका है, मुझे एक C++ सरणी के एक तत्व को कम करने में समस्या आ रही है।सी ++

मैं की तरह कुछ हासिल करना चाहते हैं:

template <class T> 
struct array_element { }; 

template <class T> 
struct array_element<T[]> { 
    using type = T; 
}; 

int main() { 
    int a[5] = {1, 2, 3, 4, 5}; 
    array_element<decltype(a)>::type element = a[0]; 
} 

लेकिन कोड स्पष्ट रूप से संकलन नहीं करता है (पूर्णांक [5] से मेल नहीं खाता टी []) ...

उत्तर

12

आप एक की जरूरत है विशेषज्ञता के लिए अतिरिक्त तर्क:

template <class T, size_t N> 
struct array_element<T[N]> { 
    using type = T; 
}; 

वैकल्पिक रूप से:

std::remove_reference<decltype(a[0])>::type element = a[0]; 

या:

auto element = a[0]; 
+0

बेशक! धन्यवाद! –

+0

वास्तविक कोड थोड़ा अधिक जटिल है (टेम्पलेट्स तर्क के अंदर है) और 'decltype' के साथ दृष्टिकोण का उपयोग करके वहां बहुत साफ नहीं होगा ... लेकिन विशेषज्ञता के अतिरिक्त पैरामीटर के साथ आपका सुझाव पूरी तरह उपयुक्त है! –

12

उपयोग std::remove_extent टेम्पलेट वर्ग (सी ++ 11) या std::remove_extent_t उर्फ ​​टेम्पलेट (सी ++ 14) एक सरणी तत्व (दोनों are declared in type_traits header file) का एक प्रकार प्राप्त करने के लिए:

std::remove_extent<decltype(a)>::type element0 = a[0]; 

std::remove_extent_t<decltype(a)> element1 = a[1]; 

Live demo

तुम भी उपयोग कर सकते हैं std::remove_all_extents (सी ++ 11) या std::remove_all_extents_t (सी ++ 14) से get a type of an element of a multidimensional array

+0

अच्छा! मुझे इस बारे में पता नहीं था! –