2016-04-18 11 views
5

निम्न उदाहरणएक variadic टेम्पलेट के टेम्पलेट तर्क की संख्या

template <size_t... Entries> 
struct StaticArray 
{ 
    enum {N = sizeof...(Entries)}; 
    size_t array[N] = {Entries...}; 
}; 

में एक enum में प्रविष्टियों की संख्या भंडारण भंडारण अधिक मेरे लिए एक हैक की तरह लगता है।

क्या यह वास्तव में प्रविष्टियों की संख्या को संग्रहीत करने का टेक्स्ट बुक तरीका है या क्या ऐसा करने का एक क्लीनर तरीका है?

+1

"भंडारण" करने के लिए एक अजीब तरीका है इसे रखें। कोई भंडारण नहीं किया जाता है, और सी ++ टेम्पलेट्स सभी घोषणाएं हैं। तो 'एन' किसी और चीज से अधिक उपनाम है। ऐसा कहकर, मैं @ बैरी के उत्तर से सहमत हूं: 'enum' सबसे अच्छा तंत्र नहीं है। – rici

+1

"एनम हैक" सचमुच इसका सामान्य नाम था, इसलिए आपको कुछ बताना चाहिए :-) –

उत्तर

6

मैं एक static constexpr सदस्य पसंद करेंगे:

template <size_t... Entries> 
struct StaticArray 
{ 
    static constexpr size_t N = sizeof...(Entries); 
    size_t array[N] = {Entries...}; 
}; 
संभवत: अन्य constexpr सदस्य कार्यों में से एक समूह के साथ

(size(), begin(), end(), data(), आदि)

+0

+1, 'enum' हैक अब और आवश्यक नहीं है, अब हमारे पास' constexpr' है (और ईमानदार होने के लिए, संभवतः इससे पहले कई व्यावहारिक स्थितियों में)। जब तक आपका कार्यक्रम 'constexpr' का पता नहीं लेता है, तब तक इसे एक शाब्दिक (किसी भी आधे सभ्य कंपाइलर, यड्डा यड्डा) के रूप में रेखांकित किया जाएगा। –

संबंधित मुद्दे