这在c ++ 11中合法吗?使用最新的 intel 编译器编译并且似乎可以工作,但我只是觉得这是侥幸。
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;
然而,在检查生成的程序集时,使用带有此空间的放置 new 似乎会阻止编译器优化对“new”的调用(这似乎发生在仅使用常规 '_ptr = new c1;' 时)
EDIT2:更改了代码以使意图更加清晰。