如何获取指向类的复制构造函数的成员函数指针?

rub*_*nvb 5 c++ member-function-pointers copy-constructor c++11 c++14

有没有办法获得一个成员函数指针到类的复制构造函数?我知道如何定义和使用普通的成员函数指针,但我似乎无法找到一种方法来获取它.

J. *_*rez 3

根据 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;
}
Run Code Online (Sandbox Code Playgroud)

或者:(还涵盖其他用例的简化)

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;
}
Run Code Online (Sandbox Code Playgroud)

  • @NirFriedman 如果省略尾随返回类型,则“+”将是相关的(在这种情况下,返回类型是从 return 语句的参数推导出来的,而不应用 lambda 到函数指针的转换) (2认同)