मैं यह काम करने की कोशिश कर रहा हूँ:
template < typename T, T VALUE >
void f()
{
/* ... */
}
int main()
{
f<10>(); // implicit deduction of [ T = int ] ??
return (0);
}
इसका उद्देश्य बहुत अधिक जटिल टेम्पलेट को सरल बनाना है।
कई खोजों के बाद, मुझे सी ++ 0x पर ऐसा करने का कोई तरीका नहीं मिला, इसलिए स्टैक ओवरफ्लो मेरा अंतिम उपाय है।
- सभी प्रकार के टी को निर्दिष्ट किए बिना संभव है ...
- मैं g++ C++0x पर हूं, इसलिए सेक्सी सामग्री की अनुमति है।
3 जवाब
C++0x परिचय decltype()
, जो ठीक वही करता है जो आप चाहते हैं।
int main()
{
f<decltype(10), 10>(); // will become f<int, 10>();
return 0;
}
सी ++ में स्ट्रक्चर/कक्षाओं के लिए कोई स्वचालित टेम्पलेट कटौती नहीं है। हालांकि आप क्या कर सकते हैं ऐसा कुछ है (चेतावनी, अवांछित!):
#define F(value) f<decltype(value), value>
template < typename T, T VALUE >
void f()
{
/* ... */
}
int main()
{
F(10)();
return (0);
}
यह केवल टेम्प्लेट कोड जितना साफ नहीं है, लेकिन यह स्पष्ट है कि यह क्या करता है और आपको खुद को दोहराने के बोझ से बचने की अनुमति देता है। यदि आपको गैर-सी++ 0x कंपाइलरों पर काम करने के लिए इसकी आवश्यकता है, तो आप डिक्लेटाइप के बजाय बूस्ट.टाइपोफ़ का उपयोग कर सकते हैं।
मुझे नहीं लगता कि आप ऐसा कर सकते हैं, आपको बस कंपाइलर को यह बताने की जरूरत है कि वहां एक प्रकार है। सबसे नज़दीकी चीज जो मैं सोच सकता हूं वह ऐसा कुछ है:
template <class T>
void f(T x) {
// do something with x
}
f(10);
इसके अलावा, मुझे लगता है कि आप बस थोड़ा सा मान सकते हैं और ऐसा कुछ कर सकते हैं:
template<size_t x>
void f() {
}
f<10>();
इनमें से कोई भी वह नहीं है जो आप चाहते हैं, लेकिन एक सभ्य संकलक इस संकलन समय को वैसे भी बनाने में सक्षम होना चाहिए क्योंकि आप निरंतर गुजर रहे हैं।
क्या आप विस्तार से बता सकते हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं? क्या गैर-पूर्णांक प्रकारों की अनुमति दी जा रही है? आप हमें वह अधिक जटिल टेम्पलेट क्यों नहीं दिखाते जिसे आप सरल बनाने का प्रयास कर रहे हैं।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
10
वास्तव में टाइपनाम नहीं है। साथ ही C++ आपके दूसरे टेम्पलेट तर्कT
के लिए केवल कुछ पूर्णांक प्रकारों की अनुमति देता है। आप वहां सबसे बड़े उपलब्ध प्रकार का उपयोग क्यों नहीं करते?