मैं यह काम करने की कोशिश कर रहा हूँ:

template < typename T, T VALUE >
void            f()
{
    /* ... */
}

int             main()
{
    f<10>();    // implicit deduction of [ T = int ] ??
    return (0);
}

इसका उद्देश्य बहुत अधिक जटिल टेम्पलेट को सरल बनाना है।

कई खोजों के बाद, मुझे सी ++ 0x पर ऐसा करने का कोई तरीका नहीं मिला, इसलिए स्टैक ओवरफ्लो मेरा अंतिम उपाय है।

  • सभी प्रकार के टी को निर्दिष्ट किए बिना संभव है ...
  • मैं g++ C++0x पर हूं, इसलिए सेक्सी सामग्री की अनुमति है।
9
Gravemind 18 जुलाई 2011, 22:14
10 वास्तव में टाइपनाम नहीं है। साथ ही C++ आपके दूसरे टेम्पलेट तर्क T के लिए केवल कुछ पूर्णांक प्रकारों की अनुमति देता है। आप वहां सबसे बड़े उपलब्ध प्रकार का उपयोग क्यों नहीं करते?
 – 
Benjamin Bannier
18 जुलाई 2011, 22:17

3 जवाब

सबसे बढ़िया उत्तर

C++0x परिचय decltype(), जो ठीक वही करता है जो आप चाहते हैं।

int main()
{
  f<decltype(10), 10>(); // will become f<int, 10>();
  return 0;
}
5
Sean 18 जुलाई 2011, 22:25

सी ++ में स्ट्रक्चर/कक्षाओं के लिए कोई स्वचालित टेम्पलेट कटौती नहीं है। हालांकि आप क्या कर सकते हैं ऐसा कुछ है (चेतावनी, अवांछित!):

#define F(value) f<decltype(value), value>

template < typename T, T VALUE >
void            f()
{
    /* ... */
}

int             main()
{
    F(10)();
    return (0);
}

यह केवल टेम्प्लेट कोड जितना साफ नहीं है, लेकिन यह स्पष्ट है कि यह क्या करता है और आपको खुद को दोहराने के बोझ से बचने की अनुमति देता है। यदि आपको गैर-सी++ 0x कंपाइलरों पर काम करने के लिए इसकी आवश्यकता है, तो आप डिक्लेटाइप के बजाय बूस्ट.टाइपोफ़ का उपयोग कर सकते हैं।

5
Karel Petranek 18 जुलाई 2011, 22:25

मुझे नहीं लगता कि आप ऐसा कर सकते हैं, आपको बस कंपाइलर को यह बताने की जरूरत है कि वहां एक प्रकार है। सबसे नज़दीकी चीज जो मैं सोच सकता हूं वह ऐसा कुछ है:

template <class T>
void f(T x) {
    // do something with x
}

f(10);

इसके अलावा, मुझे लगता है कि आप बस थोड़ा सा मान सकते हैं और ऐसा कुछ कर सकते हैं:

template<size_t x>
void f() {

}

f<10>();

इनमें से कोई भी वह नहीं है जो आप चाहते हैं, लेकिन एक सभ्य संकलक इस संकलन समय को वैसे भी बनाने में सक्षम होना चाहिए क्योंकि आप निरंतर गुजर रहे हैं।

क्या आप विस्तार से बता सकते हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं? क्या गैर-पूर्णांक प्रकारों की अनुमति दी जा रही है? आप हमें वह अधिक जटिल टेम्पलेट क्यों नहीं दिखाते जिसे आप सरल बनाने का प्रयास कर रहे हैं।

2
Evan Teran 18 जुलाई 2011, 22:25