2014-07-25 17 views
7

पर कार्यात्मक पैरामीटर के तर्कों को अनपॅक करना मेरे पास C++ में टेम्पलेट कक्षाओं में कार्यात्मक टेम्पलेट तर्क शामिल हैं।एक C++ टेम्पलेट वर्ग

मैं एक टेम्पलेट वर्ग Foo एक एकल टेम्पलेट पैरामीटर लेने का निर्धारण कैसे करेंगे Fun

template <typename Fun> 
    struct Foo { 
     ... 
    }; 

ऐसा है कि जैसे

void bar(std::string a, float b, char c) 
    { 
     ... 
    } 

एक समारोह को देखते हुए तो Foo<bar>::args_t

के लिए एक typedef के बराबर होगी
std::tuple<std::string, float, char> 

क्या यह पी है ossible? (std::tuple यहाँ के उपयोग सिर्फ स्थूलता के लिए है। आम तौर पर अगर यह एक कार्यात्मक टेम्पलेट पैरामीटर के तर्कों पर पैटर्न मिलान की तरह कुछ करने के लिए संभव है मैं सोच रहा हूँ।)

बिंदु Foo परिभाषित करने के लिए होने से बचने के लिए है जैसे

template Foo<typename A, typename B, typename C, typename D, 
     D (*Fun)(A a, B b, C c)> 
    struct Foo { 
     typedef std::tuple<A,B,C> args_t; 
    }; 

एक तरह से जो दोनों प्रकार्य तर्क की एक निश्चित संख्या के लिए प्रतिबद्ध है, और टेम्पलेट पैरामीटर के रूप में स्पष्ट रूप से प्रदान किया जाना तर्क की आवश्यकता होती है और समारोह के प्रकार वापसी की आवश्यकता है में। (विविधता वाले टेम्पलेट्स का उपयोग करके Foo परिभाषित करना संभवतः पूर्व समस्या को हल कर सकता है, लेकिन बाद के बारे में क्या?)

धन्यवाद!

+0

variadic टेम्पलेट्स में देखो नेस्टेड प्रकार उपयोग कर सकते हैं। इसके अलावा आप नामकरण प्रकारों से '_t' से बचना चाहेंगे क्योंकि वे POSIX में आरक्षित हैं। – user657267

+1

@ user657267 मैं विविध टेम्पलेट्स से काफी अवगत हूं, और मेरे प्रश्न में उनका उल्लेख किया है। '_t' के साथ नामकरण प्रकारों के बारे में टिप्पणी बाएं क्षेत्र से थोड़ा सा प्रतीत होता है। – factotum

+0

यही कारण है कि यह एक टिप्पणी है और एक जवाब नहीं है। – user657267

उत्तर

11

प्राथमिक टेम्पलेट घोषित करें और इसे अनुमोदित छोड़ दें।

template<typename T> 
struct foo;  // unimplemented primary template 

फिर आंशिक विशेषज्ञता प्रदान करें जो फ़ंक्शन प्रकारों को टेम्पलेट तर्क के रूप में मेल खाता है।

template<typename Result, typename... Args> 
struct foo<Result(Args...)> 
{ 
    using args_t = std::tuple<Args...>; 
}; 

आप के रूप

foo<decltype(bar)>::args_t 

Live demo

+0

ग्रेट, 'decltype' यहां कुंजी है, बहुत बहुत धन्यवाद! – factotum

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