मैं अपना खुद का signal
/स्लॉट (पर्यवेक्षक पैटर्न, क्यूटी शैली) तंत्र लागू कर रहा हूं, इसलिए मेरे पास property
हो सकता है जो सूचित करता है ... सामान ... यह बदल गया है।कार्यान्वयन संकेत (पर्यवेक्षक पैटर्न): उत्परिवर्तनीय या const_cast आवश्यक है?
मुझे लगता है कि सी ++ 11 एक बहुत ही सस्ता और फीचरपूर्ण कार्यान्वयन संभव बनाने के लिए आवश्यक सब कुछ प्रदान करता है। "मुद्दा" मैं दौड़ रहा हूं अगर मैं const
ऑब्जेक्ट के सिग्नल पर "कनेक्ट" करना चाहता हूं, तो मुझे signal::connect
फ़ंक्शन को कॉन्स होने की आवश्यकता है, लेकिन कॉलबैक/पर्यवेक्षकों की सूची संशोधित करें। इसे ठीक करने के दो सरल तरीके हैं:
const_cast
connect
के अंदर सूचियां।- सूचियां
mutable
बनाएं।
दोनों एक ही बात की तरह मुझे लगता है (और इस से पहले पूछा गया है, जैसे this question में), और बिल्कुल ठीक तार्किक, लेकिन शैलीगत संदिग्ध। इसलिए सवाल है। क्या इसके आसपास कोई रास्ता है या क्या यह const_cast
/mutable
का वास्तव में उचित उपयोग है?
कुछ prelimenary कोड मैं अब है के रूप में:
template<typename... ArgTypes>
class signal
{
public:
template<typename Callable>
void connect(Callable&& callback) const
{
std::lock_guard<std::mutex> lock(slots_mutex);
slots.emplace_back(callback);
}
void emit(ArgTypes... arguments) const
{
std::lock_guard<std::mutex> lock(slots_mutex);
for(auto&& callback : slots)
{
callback(arguments...);
}
}
private:
// mutable here allows to connect to a const object's signals
mutable std::vector<std::function<void(ArgTypes...)>> slots;
std::mutex slots_mutex;
};
नोट मैं इस कोड का परीक्षण नहीं किया; यह सिर्फ मेरे वर्तमान दिमाग की प्रतिबिंब है।
गैर-परीक्षण कोड ... tsk tsk ... –
@ अरनाव मैं सचमुच परीक्षण लिख रहा हूं, मुझे बस इस डिजाइन को इस तरह से हल करने की आवश्यकता है: पी। – rubenvb
मुझे डर है कि मुझे समझ में नहीं आता कि क्यों 'सिग्नल' को 'const' विधियों का खुलासा करना चाहिए। क्यों 'सिग्नल' के उपयोगकर्ता को यह तय नहीं करना चाहिए कि वे इसे उत्परिवर्तनीय (या नहीं) चाहते हैं? –