(मैं इस प्रश्न को सी ++ 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)
}}
मुझे लगता है कि यह ठीक है। 'decltype' सही प्रकार प्राप्त करता है (यानी '' 'एक ऐसे फ़ंक्शन के लिए जो एक lvalue संदर्भ देता है,' && 'जो एक फ़ंक्शन संदर्भ देता है, और अन्यथा गैर-संदर्भ देता है)। –
कृपया, अगर आप वास्तव में क्या कर रहे हैं तो आप सभी के लिए जीवन को बहुत आसान बना देंगे। आप * कुछ * नामकरण नहीं कर रहे हैं। मूल नाम अभी भी मौजूद है। आप अग्रेषित कर रहे हैं, या उपनाम या एक रैपर समारोह प्रदान कर रहे हैं। इसका नाम बदलने के साथ कुछ भी नहीं है। नामकरण का अर्थ है * बदलना * नाम, पुराने नाम को एक नए – jalf
@jalf, अच्छे बिंदु के पक्ष में दूर कर दें। मुझे लगता है, मूल नाम को दूर करना मुश्किल है। जैसा कि मैंने कल्पना की एकमात्र तरीका मूल परिभाषा को एक अनाम नामस्थान में संलग्न करना है। लेकिन हाँ, यह विचार नहीं था। – alfC