클래스의 복사 생성자에 대한 멤버 함수 포인터를 가져 오는 방법이 있습니까? 정의하고 정상적인 멤버 함수 포인터를 사용하는 방법을 알고 있지만 그것을 얻는 방법을 알아낼 수 없습니다.클래스의 복사 생성자에 대한 멤버 함수 포인터를 얻으려면 어떻게해야합니까?
답변
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
+는 필요하지 않아야합니다. 이유가 확실하지 않습니다. 그것 없이는 아무런 결과없이 암시 적 변환을 트리거해야합니다. –
- 1. 멤버 함수 포인터를 호출하려면 어떻게해야합니까?
- 2. 상수 객체에 대한 포인터를 사용하여 멤버 함수 포인터를 호출하려면 어떻게해야합니까?
- 3. 복사 생성자에 대한 C++ 도우미 함수
- 4. 같은 클래스의 비공개 멤버에 대한 포인터를 취하는 private 멤버 함수
- 5. 부모 클래스의 멤버 함수에 대한 함수 포인터
- 6. C++ : 같은 클래스의 멤버 인 멤버 함수 포인터를 호출하는 방법?
- 7. C++ : 복사 생성자에 대한 질문
- 8. C++에서 main() 메서드에 대한 함수 포인터를 얻으려면 어떻게해야합니까?
- 9. 멤버 함수 포인터를 어떻게 전달합니까?
- 10. 템플릿 클래스가있는 멤버 함수 복사
- 11. 클래스의 멤버 함수
- 12. 클래스의 멤버 함수 실행
- 13. 멤버 함수에 대한 포인터를 저장
- 14. 생성자에 따라 멤버 수를 변경하십시오.
- 15. 함수 포인터를 생성자에 전달하는 방법 C++
- 16. C++ : 함수 포인터를 멤버 함수와 함께 사용
- 17. 파생 클래스의 멤버 함수 포인터
- 18. 다른 클래스의 한 클래스의 멤버 함수 호출
- 19. 구조체에서 C++ 멤버 함수 포인터를 호출합니다.
- 20. C++ 포인터를 사용하여 비 정적 멤버 함수
- 21. Qt는 멤버 함수 포인터를 어떻게 식별합니까?
- 22. 복사 생성자에 대한 매개 변수 선택
- 23. 클래스의 멤버 객체를 기본 클래스의 생성자에 전달하는 방법은 무엇입니까?
- 24. 제네릭 클래스의 기본 생성자에 대한 구문은 무엇입니까?
- 25. 어떻게 함수 포인터에서 함수를 클래스의 멤버 함수로 저장합니까?
- 26. 멤버 함수 포인터를 사용하여 템플릿 클래스 특수화
- 27. C++ : 포인터를 통한 멤버 함수 호출
- 28. 템플릿이있는 클래스의 템플릿 멤버 함수 정의 (C++)
- 29. 수퍼 클래스의 멤버 함수 액세스
- 30. 다형성 클래스의 콜백 함수 멤버
당신은 할 수 없습니다. 생성자에는 이름이 없습니다. –
당신이하고 싶은 일에 의존 할 수는 없지만 lamda를 사용하여 문제를 해결할 수 있습니다. 나는. 그것을 램다에 넣었다. – Makaronodentro
[XY 문제] (http://xyproblem.info/)처럼 들립니다. 어떻게 든 생성자에 대한 포인터를 얻을 수 있다고 가정합니다 (가능한 것은 아닙니다). 어떻게 사용합니까? 당신이 해결하려고하는 실제 문제는 무엇입니까? –