2008-10-21 16 views
5

यह article सी # में, मनमाने ढंग से मूल्य प्रकारों को जोड़ने की अनुमति देने के लिए, एक + ऑपरेटर परिभाषित किया गया है। संक्षेप में यह निम्न कोड की अनुमति देता है:मनमाना मूल्य प्रकारों पर संचालन

public T Add(T val1, T val2) 
{ 
    return val1 + val2; 
} 

के रूप में वहाँ कोई गारंटी नहीं है टी प्रकार '+' ऑपरेटर के लिए एक परिभाषा है कि है, लेकिन प्रभाव इस तरह के कोड के साथ हासिल की है इस कोड संकलन नहीं करता है:

public T Add(T val1, T val2) 
{ 
    //Num<T> defines a '+' operation which returns a value of type T 
    return (new Num<T>(val1) + new Num<T>(val2)); 
} 

यह देखने के लिए लिंक का पालन करें कि न्यू क्लास यह कैसे प्राप्त करता है। वैसे भी, सवाल पर। क्या सी या सी ++ में समान प्रभाव प्राप्त करने का कोई तरीका है? जिज्ञासा के लिए, जिस समस्या को मैं हल करने की कोशिश कर रहा हूं वह है कि एक CUDA कर्नेल को अधिक प्रकार के काम करने की अनुमति देकर अधिक लचीला/सामान्य होना चाहिए।

अद्यतन: .NET के लिए, मार्क ग्रेवेल ने utility library बनाया है जो ऑपरेटर की समस्या को बहुत सुंदरता से हल करता है।

उत्तर

13

रास्ता टेम्पलेट्स के कारण सी ++ में संकलित कर रहे हैं, बस कर रही:

template < class T > 
T add(T const & val1, T const & val2) 
{ 
    return val1 + val2; 
} 

काम करेंगे, तो आप हर प्रकार जहां एक ऑपरेटर + परिभाषित नहीं है के लिए एक संकलन त्रुटि प्राप्त होगी।

सी ++ टेम्पलेट्स हर प्रकार के तत्कालता के लिए कोड उत्पन्न करते हैं, इसलिए हर प्रकार के टी कोड उत्पन्न किए जाएंगे जो सही चीज करता है। इस तरह सी ++ को न्यू <> ट्रिकरी की आवश्यकता नहीं है।

सादे सी में, जहां तक ​​मुझे पता है, यह संभव नहीं है।

+1

। मूल रूप से आप वास्तव में किस प्रकार से चाहते हैं उससे बाहर निकलते हैं और इसके बजाय कहते हैं कि 'इसे विधियों और संचालन एक्स, वाई, इत्यादि का समर्थन करने की आवश्यकता है'। यह रूबी में प्राथमिक प्रकार की तंत्र के रूप में भी प्रयोग किया जाता है। – workmad3

1

यह आसानी से सी में किया जा सकता ++ का उपयोग कर टेम्पलेट्स:


template <typename T> 
T Add(T val1, T val2) 
{ 
    return val1 + val2; 
}

नोट, तथापि, कि इस एक हेडर फाइल में परिभाषित किया जाना चाहिए, और आप शायद भी बजाय स्थिरांक संदर्भ द्वारा मानकों पास करना चाहते हैं मूल्य से

यह सादे सी में बिल्कुल नहीं किया जा सकता है।

4

सी ++ में यह कोई मुद्दा नहीं है। आपके पहले नमूने के रूप में कोड का शाब्दिक रूप से सी ++ (ईटीए: पीटर के रूप में अनुवाद किया गया) में अनुवाद किया जाता है, लेकिन मैं किसी भी परिस्थिति के बारे में सोच नहीं सकता जहां सीधे उपयोग करना + काम नहीं करेगा। आप किसी ऐसी समस्या का समाधान ढूंढ रहे हैं जो मौजूद नहीं है।

0

सी ++ में टेम्पलेट्स। सी में, भारी परेशानी और उपरि के बिना नहीं।

template<typename T> 
T add(T x, T y) 
{ 
    return x + y; 
} 
1

यह सी में भी किया जा सकता है, हालांकि मुझे यकीन नहीं है कि यह मैक्रो के साथ समस्या आवश्यकताओं को पूरा करता है।

#define ADD(A,B) (A+B) 
यह देखते हुए कि जिस तरह से इस सी ++ टेम्पलेट के साथ काम करता है 'बतख टाइपिंग' प्रकार के रूप में नामित किया गया है वर्थ
+0

नहीं !!!! ऐसा मत करो। मैक्रोज़ में, हमेशा पैरामीटर में पैरामीटर को लपेटें # परिभाषित करें स्क्वायर (ए) ((ए) * (ए)) बनाम # परिभाषित वर्ग (ए) (ए * ए) आपको स्क्वायर (एक्स + वाई) के लिए बहुत अलग परिणाम देगा –

संबंधित मुद्दे