2012-12-04 34 views
19

(मैं इस प्रश्न को सी ++ 11 तक सीमित कर दूंगा, क्योंकि मेरा मानना ​​है कि सी ++ 98 में ऐसा करने का कोई सामान्य तरीका नहीं है)।सी ++ में फ़ंक्शन का नाम बदलने (उपनाम/आगे) का सबसे अच्छा तरीका क्या है?

पहनना पड़ता है मैं एक जटिल टेम्पलेट के कार्यों और/या अतिभारित कार्यों सेट (हस्ताक्षर के संदर्भ में) है, और मुझे ठीक उसी तरह से इन कार्यों का उपयोग करना चाहते हैं, लेकिन एक अलग नाम (अर्थात, एक उपनाम है का उपयोग करते हुए)।

उदाहरण के लिए:

template<class A, class B, class C> 
D fun(A a, B& b, C&& c){ ... } 

template<class E, class F> 
G fun(H<E> he, F& f){ ... } 

... many other versions of fun 

अब मान लें कि मैं को (या उर्फ ​​, या आगे अधिक सटीक होना करने के लिए) का नाम बदलने के लिए चाहते हैं इन कार्यों, एक बार में सभी (यानी उपयोग कर सकेंगे एक ही समारोह के लिए इसे फिर से लिखने के बिना एक अलग नाम)। इस तरह, कोड के अन्य हिस्सों में मैं इसे एक अलग नाम के साथ और उपर्युक्त कोड को संशोधित किए बिना उपयोग कर सकता हूं।

करने का सही तरीका (उर्फ/आगे) gun में fun का नाम बदलने के लिए इस है?

template<typename... Args> 
inline auto gun(Args&&... args)->decltype(fun(std::forward<Args>(args)...)){ 
    return fun(std::forward<Args>(args)...); 
} 
  • यह सही मायने में सामान्य है?
  • क्या यह सबसे आसान तरीका है?
  • क्या यह इष्टतम तरीका है? (उदाहरण के लिए रेखांकित किया जा सकता है, कोई अनावश्यक प्रतियां नहीं)
  • क्या होगा यदि मूल फ़ंक्शन में कुछ SFINAE विशेषताएं हों? (उदाहरण के लिए template<class A, class B, class C, class = std::enable_if<...>::type>), decltype सभी मामलों में SFINAE स्थानांतरित करेगा?
  • क्या होगा यदि मूल फ़ंक्शन संदर्भ लौटाए? संदर्भ प्रकार को हटाने के लिए अस्वीकार नहीं किया जा रहा है? (उदाहरण के लिए double& fun(double& x){return x;})।
  • सदस्य कार्यों के बारे में भी क्या कहा जा सकता है?

स्पष्टीकरण: gun कभी नहीं बिल्कुलfun होने के लिए, के रूप में उदाहरणों अलग-अलग पतों होगा जा रहा है, लेकिन मैं क्या देख रहा हूँ सामान्य कोडिंग की दृष्टि के लिए एक नाम बदलने है।

टिप्पणी: मैं अजीब है कि लगभग सब कुछ नाम दिया जा सकता/अग्रेषित, नामस्थान, प्रकार (typedef) और टेम्पलेट प्रकार using typedef, लेकिन नहीं कार्यों को खोजने (या कहें कि सदस्य कार्यों के लिए)।


संपादित:

#define ALIAS_FUNCTION(OriginalnamE, AliasnamE) \ 
template <typename... Args> \ 
inline auto AliasnamE(Args&&... args) -> decltype(OriginalnamE(std::forward<Args>(args)...)) { \ 
    return OriginalnamE(std::forward<Args>(args)...); \ 
} 

और फिर आप इसे इस तरह का उपयोग करें: पूर्णता के लिए, और के बाद से इस तरह से यह करने के लिए हो रहा है, यहाँ मैं समारोह उपनाम परिभाषित करने के लिए एक मैक्रो जोड़ा :

namespace NS1{namepsace NS2{ 
    ALIAS_FUNCTION(NSA::fun, gun); // second argument (target name can't have namespace) 
}} 
+2

मुझे लगता है कि यह ठीक है। 'decltype' सही प्रकार प्राप्त करता है (यानी '' 'एक ऐसे फ़ंक्शन के लिए जो एक lvalue संदर्भ देता है,' && 'जो एक फ़ंक्शन संदर्भ देता है, और अन्यथा गैर-संदर्भ देता है)। –

+7

कृपया, अगर आप वास्तव में क्या कर रहे हैं तो आप सभी के लिए जीवन को बहुत आसान बना देंगे। आप * कुछ * नामकरण नहीं कर रहे हैं। मूल नाम अभी भी मौजूद है। आप अग्रेषित कर रहे हैं, या उपनाम या एक रैपर समारोह प्रदान कर रहे हैं। इसका नाम बदलने के साथ कुछ भी नहीं है। नामकरण का अर्थ है * बदलना * नाम, पुराने नाम को एक नए – jalf

+0

@jalf, अच्छे बिंदु के पक्ष में दूर कर दें। मुझे लगता है, मूल नाम को दूर करना मुश्किल है। जैसा कि मैंने कल्पना की एकमात्र तरीका मूल परिभाषा को एक अनाम नामस्थान में संलग्न करना है। लेकिन हाँ, यह विचार नहीं था। – alfC

उत्तर

10

यह सही मायने में सामान्य है?

हां।

क्या यह सबसे आसान तरीका है?

हां (दुख की बात है)।

क्या यह इष्टतम तरीका है? (उदाहरण के लिए रेखांकित किया जा सकता है, कोई अनावश्यक प्रतियां नहीं)

हां।

क्या होगा यदि मूल कार्य में कुछ SFINAE विशेषताएं हों? (उदाहरण के लिए template<class A, class B, class C, class = std::enable_if<...>::type>), क्या सभी मामलों में एसएफआईएनएई को अस्वीकार कर दिया जाएगा?

हाँ, अगर decltype अंदर अभिव्यक्ति एक त्रुटि पैदावार (अर्थात, funfun पर मौजूद नहीं है, शायद SFINAE की वजह से), यह, gun रूप में अच्छी तरह के लिए SFINAE ट्रिगर किया जाएगा अधिभार सेट से इसे हटाने के।

क्या होगा यदि मूल फ़ंक्शन संदर्भ वापस आए? संदर्भ प्रकार को हटाने के लिए अस्वीकार नहीं किया जा रहा है? (उदाहरण के लिए double& fun(double& x){return x;})।

नहीं, यह क्यों होगा?

सदस्य कार्यों के बारे में भी कहा जा सकता है, हालांकि मुझे लगता है कि कक्षा को संशोधित करना है।

यह कोई सवाल नहीं है। सदस्य कार्यों के बारे में क्या कहा जा सकता है? उपर्युक्त सभी समान रूप से लागू होते हैं।

+1

+1। चूंकि मुझे नकारात्मक के लिए उत्तर नहीं मिला, इसलिए मैं इसे स्वीकार के रूप में चिह्नित करूंगा। – alfC

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

  • कोई संबंधित समस्या नहीं^_^