मुझे प्रत्येक तत्व के लिए मनमाने ढंग से ट्यूपल में एक टेम्पलेट या ओवरलोडेड - कॉल करने की आवश्यकता है। सटीक होने के लिए, मुझे इस फ़ंक्शन को तत्वों पर कॉल करने की आवश्यकता है क्योंकि वे tuple में निर्दिष्ट हैं।प्राकृतिक (विपरीत नहीं) क्रम में std :: tuple में तत्वों के लिए func को लागू करना
उदाहरण के लिए।
1; 2.0f;
और नहीं 2.0f; 1;
: मैं एक टपल std::tuple<int, float> t{1, 2.0f};
और एक कार्यात्मक
class Lambda{
public:
template<class T>
void operator()(T arg){ std::cout << arg << "; "; }
};
मैं कुछ struct/समारोह Apply
, जो, अगर Apply<Lambda, int, float>()(Lambda(), t)
की तरह कहा जाता प्राप्त होते हैं की जरूरत है।
ध्यान दें कि अगर मैं "कच्चे" पैरामीटर पैक को फ़ंक्शन में पास कर देता हूं तो मुझे समाधान पता है और मुझे पता है कि रिवर्स ऑर्डर में टुपल्स के लिए इसे कैसे करना है। लेकिन आंशिक रूप से Apply
विशेषज्ञता के निम्नलिखित प्रयास विफल रहता है:
template<class Func, size_t index, class ...Components>
class ForwardsApplicator{
public:
void operator()(Func func, const std::tuple<Components...>& t){
func(std::get<index>(t));
ForwardsApplicator<Func, index + 1, Components...>()(func, t);
}
};
template<class Func, class... Components>
class ForwardsApplicator < Func, sizeof...(Components), Components... > {
public:
void operator()(Func func, const std::tuple<Components...>& t){}
};
int main{
ForwardsApplicator<Lambda, 0, int, float>()(Lambda{}, std::make_tuple(1, 2.0f));
}
कोड संकलित किया गया है, लेकिन केवल पहला तर्क छपा है। हालांकि, अगर मैं
template<class Func, class... Components>
class ForwardsApplicator < Func, 2, Components... >{...}
साथ ForwardsApplicator
विशेषज्ञता की जगह इसे सही ढंग से काम करता है - लेकिन, ज़ाहिर है, केवल लंबाई 2. साथ tuples मैं इसे कैसे करते हैं के लिए - यदि संभव हो तो, सुंदर ढंग से - मनमाना लंबाई की tuples के लिए?
संपादित करें: आपके उत्तरों के लिए धन्यवाद दोस्तों! सभी तीन वास्तव में सीधे-से-पॉइंट हैं और सभी संभावित लाभ बिंदुओं से इस मुद्दे को समझाते हैं।
यही वह जवाब है जिसे मैं ढूंढ रहा था: सुरुचिपूर्ण और डिजाइन के करीब बहुत करीब था। धन्यवाद! – Mischa
आप उस विशेष गैर-प्रकार के टेम्पलेट तर्क के बारे में सही हैं जो अवैध है। मुझे लगता है कि ओपी वीसी 12 का उपयोग कर रहा है, जो किसी भी त्रुटि को जारी नहीं करता है लेकिन कुछ भी अच्छा नहीं करता है; समस्या को वीसी 14 सीटीपी 5 में तय किया गया है, जो एक अच्छी त्रुटि जारी करता है। यह ध्यान देने योग्य है कि क्लैंग (3.5.0 और ट्रंक 228146) बिना किसी डायग्नोस्टिक के कोड को संकलित करता है और विशेषज्ञता से मेल खाता है। यह रिपोर्ट किया जाना चाहिए। – bogdan