2012-02-10 21 views
5

सबसे पहले, मुझे वास्तव में कोई समस्या नहीं है, लेकिन मुझे चीजों को यथासंभव सरल रखना पसंद है। मैं Math नामक एक टेम्पलेट श्रेणी का उपयोग कर रहा हूं और कई अन्य सामानों के अलावा यादृच्छिक कार्य भी हैं।टेम्पलेटेड क्लास में स्टेटिक गैर टेम्पलेटेड फ़ंक्शन

यादृच्छिक कार्यों के विभिन्न प्रकार, और यादृच्छिक बीज सेट करने के लिए एक फ़ंक्शन। इसलिए बीज फ़ंक्शन को छोड़कर प्रत्येक फ़ंक्शन class Real प्रकार का उपयोग करता है। लेकिन मैं पारित करने के लिए कुछ यादृच्छिक (haha) फ़ंक्शन को कॉल करने में सक्षम होना टाइप है जब मैं बीज सेट करना चाहते हैं:

Math<u32>::SeedRandom(System::time()); 

फिर इस एक वास्तविक समस्या नहीं है, लेकिन मैं उत्सुक अगर यह संभव है कर रहा हूँ <u32> का उपयोग करने की आवश्यकता के बिना एक ही परिणाम प्राप्त करें।

यहाँ

गणित वर्ग से एक टुकड़ा:

template <class Real> 
class Math 
{ 
public: 
    static void SeedRandom(u32 seed) { srand(seed); } 
    static Real UnitRandom() { return (Real)((f64)rand()/(f64)RAND_MAX); } 
}; 

btw। f64double और u32 से unsigned int पर टाइप किया गया है।

उत्तर

4

स्थिर कार्यों को ClassName::FunctionName द्वारा बुलाया जाना चाहिए। क्योंकि ClassName एक टेम्पलेट है, आप को टेम्पलेट तर्क निर्दिष्ट करें। स्टेटिक फ़ंक्शंस को ऑब्जेक्ट पर भी कहा जा सकता है, यानी object.StaticFunctionName, इसलिए यदि आपके पास पहले से कोई ऑब्जेक्ट है, तो आप टेम्पलेट तर्क निर्दिष्ट करने से बच सकते हैं, लेकिन किसी ऑब्जेक्ट पर एक स्थिर फ़ंक्शन को कॉल करने वाली मेरी व्यक्तिगत पक्षपातपूर्ण राय में बदसूरत है।

मैं क्या करूँगा यदि मैं था तो आप अपनी कक्षा के समान नामस्थान में फ़ंक्शन को एक गैर-सदस्य (टेम्पलेट के लिए मित्र) की आवश्यकता है।

+0

हाँ, उस फ़ंक्शन को कॉल करने के लिए एक सिंगलटन ऑब्जेक्ट संभव होगा, लेकिन उस स्थिति में यह वास्तव में बदसूरत होगा :) बस यह जानना चाहता था कि कोड को कोड करने का कोई तरीका है, इसलिए इस प्रकार को निर्दिष्ट करने की कोई आवश्यकता नहीं है। मैंने थोड़ा सा प्रयास किया और इसे 'मठ :: SeedRandom ((u32) सिस्टम :: समय()) जैसे कॉल करना संभव है; '। यह कम से कम दिखाएगा कि इस प्रकार का उपयोग नहीं किया जाता है, लेकिन यह केवल अनावश्यक रूप से संकलित समय बनाता है, और यह और भी बदसूरत है तो बस '' के साथ कॉल करें। – v01pe

+0

@ v01pe: मेरी विकृत पक्षपातपूर्ण राय में 'शून्य *' का उपयोग करने का कोई मतलब नहीं है कि इस प्रकार का उपयोग नहीं किया जाता है। आईएमओ, जैसा कि मैंने पहले ही कहा है, फ्रीस्टैंडिंग फ़ंक्शन सबसे अच्छा समाधान है। फ्रीस्टैंडिंग फ़ंक्शंस किसी भी तरह से सीओ ++ –

+0

में ओओपी के प्रतिमान का विरोध नहीं करते हैं बेशक आप सही हैं, 'शून्य *' का उपयोग करके इसका मतलब नहीं है! – v01pe

2

फ़ंक्शन को Math::SeedRandom के रूप में कॉल करने योग्य बनाने का कोई तरीका नहीं है (Math पाठ्यक्रम के गैर-टेम्पलेट को छोड़कर)। सबसे अच्छा आप कर सकते हैं SeedRandom को एक अलग, गैर-टेम्पलेट श्रेणी में ले जाएं या बस इसे Math<whatever>::SeedRandom के रूप में कॉल करने के साथ लाइव रहें।

+0

मैं इसे यादृच्छिक कार्यों के समान कक्षा में रखना चाहता हूं, लेकिन यह इंगित करने के लिए धन्यवाद कि यह अन्य तरीकों से संभव नहीं है। – v01pe

0

मुझे "गणित" नामक कक्षा की अत्यधिक संदेह है क्योंकि मुझे "गणित" के उदाहरण की कल्पना करना मुश्किल लगता है। इसकी आवाज़ से, आप कुछ टेम्पलेट मुफ्त कार्यों के साथ एक नामस्थान का उपयोग करना चाह सकते हैं। आपको यह समस्या हो रही है कि यह एक संकेत हो सकता है कि शायद आपको वह नहीं करना चाहिए जो आप कर रहे हैं।

सी ++ एक बहु-प्रतिमानी भाषा है, और इस तरह जावा जैसी भाषाओं के विपरीत सब कुछ किसी ऑब्जेक्ट का हिस्सा बनने के लिए मजबूर नहीं होता है।

+0

बात यह है कि कक्षा में कुछ टेम्पलेटेड 'कॉन्स' भी शामिल है, जिनका उपयोग कार्यों के अंदर किया जाता है।इसके अलावा मैंने जिस फ़ंक्शन का उल्लेख किया है वह एकमात्र फ़ंक्शन है, जिसे टेम्पलेट की आवश्यकता नहीं है। मुझे पता है कि यह करने का सबसे अच्छा तरीका नहीं है, और मैं इसे एक दिन रिफैक्टर करता हूं, लेकिन अभी यह पूरी तरह से इसके उद्देश्य को पूरा करता है। – v01pe

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