5

클래스의 복사 생성자에 대한 멤버 함수 포인터를 가져 오는 방법이 있습니까? 정의하고 정상적인 멤버 함수 포인터를 사용하는 방법을 알고 있지만 그것을 얻는 방법을 알아낼 수 없습니다.클래스의 복사 생성자에 대한 멤버 함수 포인터를 얻으려면 어떻게해야합니까?

+5

당신은 할 수 없습니다. 생성자에는 이름이 없습니다. –

+0

당신이하고 싶은 일에 의존 할 수는 없지만 lamda를 사용하여 문제를 해결할 수 있습니다. 나는. 그것을 램다에 넣었다. – Makaronodentro

+8

[XY 문제] (http://xyproblem.info/)처럼 들립니다. 어떻게 든 생성자에 대한 포인터를 얻을 수 있다고 가정합니다 (가능한 것은 아닙니다). 어떻게 사용합니까? 당신이 해결하려고하는 실제 문제는 무엇입니까? –

답변

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; 
} 

또는 : (추가적인 사용 사례를 덮는 단순화)

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; 
} 
+0

누락 된 줄은 #include 및 #include 이며 GCC 컴파일러를 사용하여 C++ 11 및 C++ 14 모두에서 작동합니다. 어떤 문제가 있습니까? –

+0

[신경 쓰지 마] (http://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this). 오늘 새로운 것을 배웠습니다. – StoryTeller

+0

+는 필요하지 않아야합니다. 이유가 확실하지 않습니다. 그것 없이는 아무런 결과없이 암시 적 변환을 트리거해야합니다. –

관련 문제