Czy to jest legalne w języku C++ 11? Kompiluje się z najnowszym kompilatorem intel i wydaje się działać, ale po prostu mam wrażenie, że to jest fuks.Nowe miejsce docelowe na podstawie szablonu sizeof()
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*))];
};
Konkretnie zastanawiam się, czy naprawdę jest void* space[(c1<_generic_object>::size/sizeof(void*))];
zamiar dać odpowiedni rozmiar dla obiektów członkowskich C1'S (_obj i _pfunc). (To nie jest).
EDIT: Więc po pewnym dalszych badań Wydaje się, że dodaje się będzie (więcej?) Popraw:
typename aligned_storage<sizeof(c1<_generic_object>),
alignment_of<c1<_generic_object>>::value>::type space;
Jednak po inspekcji wygenerowany montaż, przy użyciu umieszczenie nowego w tym miejscu wydaje się hamować kompilator z optymalizacji dala wezwanie do „nowych” (co wydawało się zdarzyć podczas korzystania tylko regularne „_ptr = new c1;”
EDIT2: Zmieniono kod, aby intencje trochę jaśniejsze
Jak to się ma nawet skompilować bez inicjalizatora dla referencyjnego elementu w 'c1'? Czy jest jakieś szczególne znaczenie dla tego referencyjnego członka, czy nie? – AnT
Również, co jest ideą obliczania rozmiaru pamięci za pomocą 'sizeof (_obj)', która ocenia rozmiar całego obiektu (np. 'Sizeof T'), ale później konstruuje obiekt' c1 'w tym miejscu, który będzie fizycznie zawierają tylko * odwołanie * do 'some_type_t' (zaimplementowane jako wskaźnik)? –
AnT
Nie wiem, czy to się kompiluje, czy nie, jest to bardzo uproszczony przykład, który napisałem tutaj, aby przejść do odpowiednich części. Piszę klasę sygnał/oddzwanianie i chcę wyeliminować dynamiczne przydzielanie pamięci, jeśli to możliwe. –