2017-01-02 3 views
6

मैं इस जैसे एक वर्ग है कि चर प्रकार की एक टपल शामिल है:एक नए टुपल में एक टुपल का सबसेट निकालने के लिए कैसे?

template<class... Ts> 
struct Tester 
{ 
    std::tuple<Ts...> t; 

    template<class... T2s> 
    std::tuple<T2s...> Get() { ??? } 
}; 

एक उदाहरण उदाहरण है Tester<int, float, char>

मैं अपने प्राप्त समारोह भीतरी टपल का केवल एक उपसमूह वापस जाने के लिए चाहते हैं। उदाहरण के लिए, tester.Get<int, char> एक std::tuple<int, char> लौटाएगा जिनके मूल्य आंतरिक टुपल के उपयुक्त सदस्यों से कॉपी किए गए हैं।

आप मान सकते हैं कि प्रत्येक प्रकार एक बार में अधिकतम बार दिखाई देता है और Get केवल ट्यूबल में समझदार टेम्पलेट पैरामीटर के साथ बुलाया जाएगा।

उत्तर

8

दरअसल, यह आपके विचार से आसान है। std::get एक प्रकार, टपल सदस्य सूचकांक के लिए एक विकल्प के रूप में (सी ++ 14 के बाद से) लेता है, और टपल से पहले मिलान प्रकार देता है:

#include <tuple> 
#include <iostream> 
#include <type_traits> 

template<class... Ts> 
struct Tester 
{ 
    std::tuple<Ts...> t; 

    template<class... T2s> 
    std::tuple<T2s...> Get() { 
     return std::tuple<T2s...> {std::get<T2s>(t)...}; 
    } 
}; 


int main() 
{ 
    Tester<int, char, float> t; 

    t.t=std::make_tuple(0,1,2); 

    auto result=t.Get<int, float>(); 

    std::cout << 
     std::is_same<decltype(result), std::tuple<int, float>>::value 
      << std::endl; 

    int &i=std::get<0>(result); 
    float &f=std::get<1>(result); 

    std::cout << i << " " << f << std::endl; 
    return 0; 
} 

आउटपुट, जीसीसी 6.3.1 के साथ परीक्षण किया:

1 
0 2 
+2

"पहला मिलान प्रकार" भ्रामक है। यदि प्रकार एक से अधिक बार होता है, तो कार्यक्रम खराब हो जाता है। –

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