5

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

template<class T> 
auto transmogrify(T x) 
-> ??? 
{ 
    using std::abs; 
    return abs(x)+2.0; 
} 

घोषणा का उपयोग कर बनाता है इस समारोह टेम्पलेट के शरीर काम: समस्या, मैं अभी का सामना करना पड़ रहा हूँ मैं बहुत इस तरह एक समारोह टेम्पलेट की वापसी प्रकार लिखने के लिए पता नहीं कैसे वह यह है कि क्योंकि उनके पास एक संबद्ध नेमस्पेस नहीं है (और इसलिए, कोई एडीएल नहीं है)। लेकिन यदि उपयोगकर्ता द्वारा परिभाषित प्रकार के लेखक अपना स्वयं का पेट फ़ंक्शन प्रदान करते हैं तो मैं विशिष्ट पेट फ़ंक्शंस का उपयोग करने के लिए ट्रांसमोग्रिफ़ाई करना चाहता हूं। मैं बस

-> decltype(abs(x)+2.0) 

उपयोग नहीं कर सकते, क्योंकि इस के लिए, कहते हैं, युगल काम नहीं है, क्योंकि std :: पेट दायरे में नहीं है (जहाँ तक मैं बता सकता हूँ)। लेकिन

-> decltype(std::abs(x)+2.0) 

एडीएल अक्षम कर देगा। लेकिन एडीएल को अक्षम करना एक विकल्प नहीं है। साथ ही, एक विशेष पेट फ़ंक्शन द्वारा लौटाया गया मान टाइप टी का नहीं हो सकता है लेकिन कुछ अन्य प्रकार का हो सकता है।

रिटर्न प्रकार के मुद्दे को हल करने के तरीके पर कोई विचार (ए) एडीएल रखने और (बी) किसी विशेष पेट को प्रदान करने वाले प्रकारों के लिए कुछ डिफ़ॉल्ट फ़ंक्शन (जैसे इस मामले में std :: abs) पर वापस गिरना ।

+0

'std :: पेट का उपयोग कर #define अब; your_template_fn #undef ab' सुनिश्चित नहीं है कि –

+0

करने के लिए यह अच्छा विकल्प है, क्या कोई ऊपर टिप्पणी कर सकता है या नहीं? –

+1

@ श्री अनीबिस और इस परिभाषा का उपयोग करके रिटर्न प्रकार का फ़ंक्शन कैसे निर्धारित करते हैं? – ForEveR

उत्तर

12

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

namespace transmog_detail 
{ 
    using std::abs; 

    template<class T> 
    auto transmogrify(T x) -> decltype(abs(x) + 2.0) 
    { 
     return abs(x) + 2.0; 
    } 
} 

// Then pull it into the current namespace, as recommended by @LucDanton. 
using transmog_detail::transmogrify; 

// Or if there is a reason, you can forward. 
// template<class T> 
// auto transmogrify(T x) 
// -> decltype(transmog_detail::transmogrify(x)) 
// { 
// return transmog_detail::transmogrify(x); 
// } 
+0

बहुत चालाक! अनाम नामस्थान इस क्लीनर को या नहीं कर सकता है। निश्चित नहीं। –

+0

बेशक! :) धन्यवाद, डेव! – sellibitze

+0

@MooingDuck: यह हो सकता है, या यह नहीं हो सकता है। यदि आप किसी भी अन्य अनाम नामों का उपयोग करते हैं, तो उनके पास उपयोग करने वाला क्लॉज भी होगा, जो वांछित नहीं हो सकता है। –

-6

उपर्युक्त उत्तर अच्छे हैं, लेकिन टाइपिनोफ़ हेडर का उपयोग करने के लिए मैं सबसे अच्छा तरीका सोच सकता हूं। यह विशेष रूप से वस्तुओं के प्रकार और रचनाकारों को निर्धारित करने के लिए डिज़ाइन किया गया था।

यहाँ देखें: http://www.cplusplus.com/reference/std/typeinfo/type_info/

+4

-1 बिल्कुल उपयोगी नहीं - type_info रनटाइम प्रकार की पहचान के बारे में है, जबकि एक घोषणा को स्थिर रूप से निर्धारित प्रकार की आवश्यकता होती है। –