2015-09-29 12 views
9

मैं एक variadic वर्ग टेम्पलेटसी ++ variadic टेम्पलेट पुनरावृति वेक्टर और तुलना तत्वों

template <size_t ...T> 
struct Foo 
{ 
    std::vector<size_t> t; 

    bool IsEqual() 
    { 
    //?? 
    } 

}; 

है जो मैं की तरह उपयोग करना चाहते हैं:

Foo<1,2,3,4> foo; 
foo.data = {1,2,3,4}; 
foo.IsEqual(); 

मैं IsEqual कैसे लागू कर सकते हैं पुनरावृति और के प्रत्येक तत्व की तुलना करने के वेक्टर और झूठी/सत्य लौटते हैं यदि तत्व टेम्पलेट पैरामीटर के समान क्रम में हैं?

bool IsEqual() 
{ 
    return t.size() == sizeof...(T) && 
     IsEqual(std::make_index_sequence<sizeof...(T)>{}); 
} 

साथ:

उत्तर

6

सूचकांक अनुक्रम चाल का उपयोग करें

template <size_t... Is> 
bool IsEqual(std::index_sequence<Is...>) { 
    bool valid = true; 
    using expander = int[]; 
    expander{0, 
     (valid = valid && t[Is] == T, 
     0)... 
    }; 

    return valid; 
}  

भी तथ्य का फायदा उठाते हुए एक समारोह में यह कर सकता है कि हर मूल्य गणना और में पक्ष प्रभाव एक प्रारंभिक-खंड को अगले एक से पहले इसे एक करके किया जाता है:

bool IsEqual() 
{ 
    if (t.size() == sizeof...(T)) { 
     auto it = t.begin(); 
     bool valid = true; 

     using expander = int[]; 
     expander{0, 
      (valid = valid && *it++ == T, 
      0)... 
     }; 

     return valid; 
    } 
    else { 
     return false; 
    } 
} 
+0

क्या आप कृपया यह बता सकते हैं कि यह कैसे काम करता है? – syntagma

2

बस टेम्पलेट तर्क अनपैक करें।

template <size_t ...T> 
struct Foo 
{ 
    std::vector<size_t> t; 

    bool IsEqualTemplate(size_t index) 
    { 
    return true; 
    } 

    template <typename FIRSTARG, typename ...OTHERARGS> 
    bool IsEqualTemplate(size_t index, FIRSTARG firstArg, OTHERARGS... otherArgs) 
    { 
    return t[index] == firstArg && IsEqualTemplate(index + 1, otherArgs...); 
    } 

    bool IsEqual() 
    { 
    return t.size() == sizeof...(T) ? IsEqualTemplate(0, T...) : false; 
    } 
}; 
+0

अब यह सही दिखता है। थोड़ा सा सरल कर सकते हैं। आपको अब 'इंडेक्स Barry

+0

मुझे बस टर्नरी ऑपरेटर पसंद है। :) –

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