2010-05-05 73 views

उत्तर

12

उपयोग sizeof...:

template<typename... Args> 
constexpr std::size_t length(Args...) 
{ 
    return sizeof...(Args); 
} 

नोट आप unsigned, लेकिन std::size_t (<cstddef> में परिभाषित) का उपयोग नहीं किया जाना चाहिए। इसके अलावा, समारोह निरंतर अभिव्यक्ति होना चाहिए।


sizeof... का उपयोग कर के बिना:

namespace detail 
{ 
    template<typename T> 
    constexpr std::size_t length(void) 
    { 
     return 1; // length of 1 element 
    } 

    template<typename T, typename... Args> 
    constexpr std::size_t length(void) 
    { 
     return 1 + length<Args...>(); // length of one element + rest 
    } 
} 

template<typename... Args> 
constexpr std::size_t length(Args...) 
{ 
    return detail::length<Args...>(); // length of all elements 
} 

ध्यान दें, सब कुछ पूरी तरह से अपरीक्षित है।

+0

मैं सोच रहा था कि क्या हम लम्बाई के माध्यम से फिर से अभिशाप कर सकते हैं, टेम्पलेट के आकार को कम करके प्रत्येक पुनरावृत्ति में तर्क और तर्कों की संख्या को परिभाषित करते समय बेस केस परिभाषित किया जाता है। हम प्रत्येक पर एक काउंटर बढ़ाने में वृद्धि करते हैं यात्रा। मैं सिर्फ अपने विचार कोड में नहीं डाल पा रहा हूं .. –

+0

@ अनंत: हाँ, आप कर सकते हैं, लेकिन ऑपरेटर को फिर से लागू करने के बजाय समस्या को हल करना अधिक दिलचस्प नहीं होगा? – Potatoswatter

+0

वैराडिक टेम्पलेट्स LISP की तरह कार्य नहीं करते हैं ... आधार केस खाली सूची होना चाहिए। – Potatoswatter

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