Информация об изменениях

Сообщение Re[2]: Адрес конструктора от 17.07.2019 18:54

Изменено 17.07.2019 19:00 nen777w

Re[2]: Адрес конструктора
N>>И есть ли возможность таки этот адрес получить?
_>Нафига? Если сильно хочется сделайте функцию создающую экземпляр и используйте её адрес.

Для MSVC пришлось немного навернуть до:
struct dummy {};
void* operator new(size_t size, dummy, void* where) { return where; }
template<class T, typename ...TArg> T* ctor(void *place, TArg... args) { return new(dummy(), place) T(args...); }
template<class T, typename ...TArg> char* get_ctor_addr() { 
    decltype(&ctor<T, TArg...>) f = &ctor<T, TArg...>; 
    return reinterpret_cast<char*>(reinterpret_cast<void*&>(f)); 
}

struct A
{
    A();
};

struct B
{
    B(int);
};

char *pA = get_ctor_addr<A>();
char *pB = get_ctor_addr<B, int>();


Но в целом идея понятна.
Re[2]: Адрес конструктора
N>>И есть ли возможность таки этот адрес получить?
_>Нафига? Если сильно хочется сделайте функцию создающую экземпляр и используйте её адрес.

Для MSVC пришлось немного навернуть до:
struct dummy {};
void* operator new(size_t size, dummy, void* where) { return where; }
template<class T, typename ...TArg> T* ctor(void *place, TArg... args) { return new(dummy(), place) T(args...); }
template<class T, typename ...TArg> char* get_ctor_addr() { 
    decltype(&ctor<T, TArg...>) f = &ctor<T, TArg...>; 
    return reinterpret_cast<char*>(reinterpret_cast<void*&>(f)); 
}

struct A
{
    A();
};

struct B
{
    B(int);
};

char *pA = get_ctor_addr<A>();
char *pB = get_ctor_addr<B, int>();


Но в целом идея понятна. Единственное что попробую улучшить это написать дополнительную функцию для поиска call <адрес конструктора> в этой get_ctor_addr().