如何获得指向class的复制构造函数的成员函数指针?
How can I obtain a member function pointer to the copy constructor of a class?
有什么办法可以得到一个指向class的拷贝构造函数的成员函数指针吗?我知道如何定义和使用普通成员函数指针,但我似乎无法找到获取它的方法。
根据 C++ 标准,"the address of a constructor shall not be taken," 所以不可能按照您的要求进行操作。但是,有一个简单的解决方法。下面的代码 returns 一个指向创建其输入副本的函数的函数指针。
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;
}
有什么办法可以得到一个指向class的拷贝构造函数的成员函数指针吗?我知道如何定义和使用普通成员函数指针,但我似乎无法找到获取它的方法。
根据 C++ 标准,"the address of a constructor shall not be taken," 所以不可能按照您的要求进行操作。但是,有一个简单的解决方法。下面的代码 returns 一个指向创建其输入副本的函数的函数指针。
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;
}