Есть ли способ получить указатель функции-члена к конструктору копирования класса? Я знаю, как определить и использовать обычный указатель на функцию-член, но я не могу понять, как его получить.Как я могу получить указатель функции-члена к конструктору копирования класса?
ответ
В соответствии со стандартом C++ «адрес конструктора не должен быть принят», поэтому просто невозможно выполнить то, что вы просите. Однако есть простой способ обхода проблемы. Код ниже возвращает указатель на функцию, которая создает копию ее ввода.
template<class obj> auto GetCopyConstructor() -> obj(*)(const obj&)
{
return +[](const obj& o) { return obj(o); };
}
struct foo
{
std::string msg;
foo(const std::string& my_msg) { msg = my_msg; }
foo(const foo&) = default;
};
int main()
{
auto make_copy = GetCopyConstructor<foo>();
foo a("Hello, world");
foo b = make_copy(a);
std::cout << b.msg << std::endl;
}
В качестве альтернативы: (Упрощение, что охватывает также дополнительные случаи использования)
template<class obj> obj Copy(const obj& o) { return obj(o); }
template<class obj> obj* CopyNew(const obj& o) { return new obj(o); }
template<class obj> obj CopyFromPtr(const obj* o) { return obj(*o); }
template<class obj> obj* CopyNewFromPtr(const obj* o) { return new obj(*o); }
template<class obj> void* WhyWouldYouEvenWantToDoThis(const void* o)
{ return new obj(*(obj*)o); }
int main()
{
foo(*make_copy)(const foo&) = Copy<foo>;
foo a("Hello, world");
foo b = make_copy(a);
std::cout << b.msg << std::endl;
}
Единственные недостающие строки: #include
[Ничего] (http://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this). Сегодня узнал что-то новое. – StoryTeller
+ не нужно, не знаете, почему он там? Он должен вызывать неявное преобразование при возврате, просто без него. –
Вы не можете. Конструкторы не имеют имен. –
Вы не можете, но в зависимости от того, что вы хотите сделать, вы можете найти обходное решение, используя лампу. То есть положив его в ламу. – Makaronodentro
Это звучит как проблема [XY] (http://xyproblem.info/). Предположим, вам каким-то образом удалось получить указатель на конструктор (а не на то, что вы можете) - как вы его используете? Какова проблема, которую вы пытаетесь решить? –