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

Posted

技术标签:

【中文标题】如何获得指向类的复制构造函数的成员函数指针?【英文标题】:How can I obtain a member function pointer to the copy constructor of a class? 【发布时间】:2016-10-27 16:22:33 【问题描述】:

有什么方法可以获取指向类的复制构造函数的成员函数指针?我知道如何定义和使用普通的成员函数指针,但我似乎无法找到一种方法来获取它。

【问题讨论】:

你不能。构造函数没有名字。 你不能,但取决于你想做什么,你也许可以使用 lamda 找到解决方法。 IE。把它放在 lamda 中。 这听起来像XY problem。假设您以某种方式设法获得了指向构造函数的指针(不是您可以的)-您将如何使用它?您要解决的实际问题是什么? @Makaronodentro - 次要问题,但拼写为“lambda”,而不是“lamda”。 如果可以,您打算如何使用它?即 mfp 的语法是 (someObject.*mfp)(args)。您将如何使用复制构造函数的成员函数指针来构造具有该语法的新对象? 【参考方案1】:

根据 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 和#include ,并且代码可以在使用GCC 编译器的C++11 和C++14 中运行。你有什么问题? Never mind。今天学到了一些新东西。 + 应该不是必需的,不知道为什么它在那里?没有它,它应该在返回时触发隐式转换。 @NirFriedman @NirFriedman + 如果尾随返回类型被省略(在这种情况下,返回类型是从 return 语句的参数推导出来的,而不应用 lambda 到函数的转换 -指针) 嗯,如果我可以将不同 GetCopyConstructor 调用的结果存储在一种类型中,那就太好了。我想返回类型void*(*)(void*) 会做,但也回避类型系统:(

以上是关于如何获得指向类的复制构造函数的成员函数指针?的主要内容,如果未能解决你的问题,请参考以下文章

怎么获得成员函数的地址

如何获得指向成员函数的指针? [复制]

指向具有私有构造函数的类的类成员的指针

为啥指向基类的派生类指针可以调用派生类成员函数? [复制]

复制构造函数中的c ++用户定义成员

指向实例的成员函数而不是类的指针