लंबे समय पहले मैंने एक प्रकार अनुक्रम/मूल्य अनुक्रम से अंतिम मूल्य/प्रकार प्राप्त करने के लिए एक गैर-पुनरावर्ती कार्यान्वयन देखा था। इसकी एक अच्छी संपत्ति है, कि तत्काल टेम्पलेट की संख्या अनुक्रमित तत्वों की संख्या के स्वतंत्र (और स्थिर) है।क्या एक गैर रिकर्सिव at_c कार्यान्वयन संभव है?
कार्यान्वयन, सरल है के रूप में
// a struct that eats anything and everything
struct eat { template<class T> eat(T&&) {} };
// generates V matching with U
template<class U, class V> struct match { using type = V; };
template<class... X> struct back_
{
template<class U>
static U&& get(typename match<X, eat>::type..., U&& u)
{
return static_cast<U&&>(u); // forward
}
};
// simple macro to avoid repetition for trailing return type.
#define RETURNS(exp) -> decltype(exp) { return exp; }
// get the last value in meta O(1)
template<class T, class... Ts>
auto back(T&& t, Ts&&... ts) RETURNS(back_<Ts...>::get(static_cast<T&&>(t), static_cast<Ts&&>(ts)...))
यह एक साधारण तथ्य यह है कि एक variadic प्रकार X...
संकलक गैर रिकर्सिवली एक अन्य प्रकार T
के रूप में कई X
के रूप में देखते हैं उत्पन्न कर सकते हैं को देखते हुए का उपयोग करता है इस प्रकार है।
तो, मैं जानना चाहता हूं कि at_c
या nth
कार्यान्वित करने के लिए इसे बढ़ाने का कोई तरीका है तत्काल टेम्पलेट्स (तत्वों की संख्या से स्वतंत्र) के साथ फ़ंक्शन।
यह भी रूप में phrased जा सकता है, एक variadic प्रकार X...
और कुछ पूर्णांक N
देते हैं, यह करने के लिए गैर-पुनरावर्ती N
तत्वों से मिलकर X...
की एक उप-अनुक्रम उत्पन्न हो सकता है?
आप केवल असीमित मात्रा में अधिभार प्रदान कर सकते हैं, जिसमें मैन्युअल रूप से 1, 2, 3, 4, 6, ... पहले पैरामीटर और सामान हैं। इसके अलावा, आप जो भी प्राप्त कर सकते हैं वह 'लॉग एन' है जो मुझे विश्वास है। – Xeo
@Xeo आप पर्याप्त रूप से तेजी से बढ़ते रिकर्सन के साथ 'लॉग लॉग एन' को खींचने में सक्षम होना चाहिए? बहुत स्पष्ट, क्योंकि 'लॉग एन' के तहत 1000 रिकर्सन सीमा लगभग असीम दूर है, और 'लॉग लॉग एन' रिकर्सन गहराई को खींचने का ओवरहेड किसी भी उचित रूप से 'एन' ... – Yakk
के लिए अंतर से अधिक होगा इस तरह 'static_cast' का उपयोग कर। हमारे पास एक कारण के लिए ['std :: forward'] (http://en.cppreference.com/w/cpp/utility/forward) है: यह बहुत अधिक सुगम है और वास्तव में पाठक को बताता है * क्यों * आप इसे कर रहे हैं , 'static_cast 'के विपरीत जो कि उन लोगों के लिए आर्केन और अर्थहीन है जो जानते हैं। –