क्या यह कानूनी C++ 11 में है? नवीनतम इंटेल कंपाइलर के साथ संकलित करता है और काम करता प्रतीत होता है, लेकिन मुझे लगता है कि यह एक झलक है।टेम्पलेट आकार के आधार पर नया प्लेसमेंट()
class cbase
{
virtual void call();
};
template<typename T> class functor : public cbase
{
public:
functor(T* obj, void (T::*pfunc)())
: _obj(obj), _pfunc(pfunc) {}
virtual void call()
{
(_obj)(*_pfunc)();
}
private:
T& _obj;
void (T::*_pfunc)();
//edited: this is no good:
//const static int size = sizeof(_obj) + sizeof(_pfunc);
};
class signal
{
public:
template<typename T> void connect(T& obj, void (T::*pfunc)())
{
_ptr = new (space) functor<T>(obj, pfunc);
}
private:
cbase* _ptr;
class _generic_object {};
typename aligned_storage<sizeof(functor<_generic_object>),
alignment_of<functor<_generic_object>>::value>::type space;
//edited: this is no good:
//void* space[(c1<_generic_object>::size/sizeof(void*))];
};
विशेष रूप से मैं अगर void* space[(c1<_generic_object>::size/sizeof(void*))];
वास्तव में c1 के सदस्य वस्तुओं (_obj और _pfunc) के लिए सही आकार देने के लिए जा रहा है सोच रहा हूँ। (यह नहीं है)।
संपादित करें: तो कुछ और अधिक शोध के बाद यह प्रतीत होता है कि निम्नलिखित होगा (अधिक?) सही:
typename aligned_storage<sizeof(c1<_generic_object>),
alignment_of<c1<_generic_object>>::value>::type space;
हालांकि बाधित करने के लिए लगता है उत्पन्न विधानसभा निरीक्षण, प्लेसमेंट नई उपयोग करते हुए इस स्थान के साथ पर दूर 'नए' (करने के लिए कॉल के अनुकूलन से संकलक जो बस नियमित उपयोग करते समय होने के लिए लग रहा था '_ptr = नए c1,'
EDIT2: बदली गई इरादों एक छोटे से स्पष्ट करने के कोड
'c1' में किसी संदर्भ सदस्य के लिए प्रारंभकर्ता प्रदान किए बिना संकलित करना भी कैसा है? क्या उस संदर्भ सदस्य में कोई विशिष्ट महत्व है या नहीं? – AnT
इसके अलावा, 'sizeof (_obj)' के माध्यम से मेमोरी आकार की गणना करने के पीछे विचार क्या है, जो पूर्ण ऑब्जेक्ट (यानी 'आकार का टी') के आकार का मूल्यांकन करता है, फिर भी उस स्थान पर 'c1' ऑब्जेक्ट का निर्माण करेगा, जो शारीरिक रूप से केवल कुछ * संदर्भ * को 'some_type_t' (एक सूचक के रूप में कार्यान्वित) में शामिल किया गया है? –
AnT
मुझे नहीं पता कि यह संकलित करता है या नहीं, यह एक बहुत ही सरल उदाहरण है जिसे मैंने प्रासंगिक भागों में कटौती करने के लिए यहां पोस्ट करने के लिए बनाया है। मैं सिग्नल/कॉलबैक क्लास लिख रहा हूं और यदि संभव हो तो गतिशील स्मृति आवंटन को खत्म करना चाहता हूं। –