मैं यह सुनिश्चित करना चाहता हूं कि एक व्युत्पन्न वर्ग एक विशिष्ट स्थैतिक विधि लागू करता है। मुझे लगता है कि ऐसा करना संभव है static_assert, std::is_same, decltype, CRTP और शायद SFINAE का उपयोग करना संभव है। हालांकि, similar code मैंने पाया कि अब तक काफी जटिल है और ऐसा लगता है कि मैं अभी तक पूरी तरह से समझ नहीं पा रहा हूं कि यह मुझे अपनी आवश्यकताओं को अपनाने में असमर्थ है।व्युत्पन्न कक्षा लागू करें स्थिर विधि
मैं अब तक क्या करने की कोशिश की इस
template <class T>
class Base
{
static_assert(std::is_same<decltype(T::foo(1)), int>::value, "ERROR STRING");
};
class Derived : public Base <Derived>
{
public:
static int foo(int i) { return 42; };
};
हालांकि, यह मुझे बता संकलन नहीं है कोई एक तत्व foo भले ही विधि सही ढंग से लागू किया गया है नामित है कि व्युत्पन्न है। इसके अलावा static_assert के अंदर अभिव्यक्ति में foo के लिए वास्तविक पैरामीटर प्रदान करना गलत लगता है।
खोज एसओ ने एक समान प्रश्न का खुलासा किया जो अंत में मुझे this piece of code पर ले जाता है जहां यह जांच की जाती है कि एक प्रकार के तरीके() और अंत() को पुनरावर्तक करने वाले हैं। तो मैंने अपनी जरूरतों को इस कोड को अपनाने की कोशिश की।
template <class T>
class Base
{
template<typename C>
static char(&g(typename std::enable_if<std::is_same<decltype(static_cast<int(C::*)(int)>(&C::foo)), int(C::*)(int)>::value, void>::type*))[1];
template<typename C>
static char(&g(...))[2];
static_assert(sizeof(g<T>(0)) == 1, "ERROR STRING");
};
लेकिन यह कोड संकलित नहीं करता है क्योंकि दावा आग लगती है।
तो मेरे सवालों का
- क्यों संकलक व्युत्पन्न :: मेरी पहली उदाहरण में foo नहीं मिल सकता है कर रहे हैं?
- उदाहरण कोड में
typename C::const_iterator(C::*)() const
क्या है? क्या यह एक कॉन्स फ़ंक्शन नहीं है जो C :: const_iterator लौटा रहा है और कोई तर्क नहीं ले रहा है?C::*
का वास्तव में क्या मतलब है? तोint(C::*)(int)
क्यों है तो मेरे मामले में गलत? - मेरी समस्या का सही ढंग से समाधान कैसे करें?
मैं एमएसवीसी 12 का उपयोग कर रहा हूं लेकिन यदि संभव हो तो कोड पोर्टेबल होना चाहिए।
आप एक पार्सर नहीं हैं, अपने कोड को टोकननाइज़ न करें! :) टेम्पलेट्स पहले से पढ़ने के लिए काफी मुश्किल हैं; * बहुत * लाइनों में एक रेखा को विभाजित करना इससे भी बदतर हो जाता है। – Rubens
'" त्रुटि STRING "' दावा विफलता के लिए संदेश की एक खराब पसंद है। सही विकल्प है ["जैबरवॉकी उपयोगकर्ता को मार रहा है।"] (Http://stackoverflow.com/questions/21553327/why-is-except-pass-a-bad-programming-practice/21553515#21553515) – Casey
आधार के रूप में और व्युत्पन्न खराब वर्ग के नाम हैं और foo एक खराब विधि नाम है। ;) लेकिन यह एसएससीसीई के रूप में था और मैंने स्ट्रिंग को महत्वपूर्ण नहीं माना। हालांकि, "त्रुटि STRING" का उद्देश्य यह बताना था कि कुछ वास्तविक त्रुटि स्ट्रिंग है। मैंने कुछ चुना है जैसे "टी हस्ताक्षर के साथ एक विधि को लागू करने की जरूरत है ..."। लेकिन वैसे भी टिप्पणी के लिए धन्यवाद। :) – sigy