क्या एक वैरिएबल टेम्पलेट को टेम्प्लेट टेम्पलेट तर्क के रूप में पारित किया जा सकता है?


11

निम्नलिखित निरर्थक उदाहरण संकलन नहीं करता है, लेकिन क्या टेम्पलेट टेम्पलेट तर्क के रूप में एक चर टेम्पलेट को पारित करने का कोई और तरीका है?

template<typename T>
constexpr auto zero = T{0};

template<typename T, template<typename> auto VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T> + T{1};
}

int main()
{
    return add_one<int, zero>();
}

कंपाइलर एक्सप्लोरर पर प्रयास करें

जवाबों:


3

संक्षिप्त उत्तर: नहीं।

लंबे उत्तर: हाँ आप एक कक्षा टेम्पलेट के माध्यम से कुछ अप्रत्यक्ष उपयोग कर सकते हैं:

template<typename T>
constexpr auto zero = T{0};

template<typename T>
struct zero_global {
    static constexpr auto value = zero<T>;
};

template<typename T, template<typename> class VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T>::value + T{1};
}

int main()
{
    return add_one<int, zero_global>();
}

जीवंत उदाहरण


थोड़ा पीछे की तरफ लगता है कि किसी को स्थैतिक सदस्य के साथ संरचना का सहारा लेना पड़ता है। क्या यह कुछ भविष्य के मानक के साथ आने की उम्मीद कर सकता है? किसी भी विचार क्यों यह आज पहले से ही नहीं है?
आइडल 463035818

1
@ पूर्ववार्ता_463035818 मुझे नहीं लगता कि किसी ने अभी तक इसे प्रस्तावित किया है (कभी इसे कागज में नहीं देखा, शायद मैंने इसे याद किया हो?) और एक जटिलता भी है। अभी, गैर-प्रकार टेम्पलेट पैरामीटर प्री-वैल्यू हैं। लेकिन क्या value<T>मतलब होगा? वैश्विक चर का संदर्भ? इसके अलावा, आप ODR गैर-प्रकार के टेम्पलेट पैरामीटर का उपयोग नहीं कर सकते हैं, लेकिन आप एक वैश्विक टेम्पलेट के साथ कर सकते हैं।
गुयिलम रेसकोट

संकेत के लिए धन्यवाद, मैं अभी भी c ++ 11 पर हूं, इसलिए मैं वेरिएबल टेम्प्लेट्स से बहुत परिचित नहीं हूं, और कुछ ऐसा है जिससे मुझे बॉक्स से बाहर निकलने की उम्मीद होगी
idclev 463035818
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.