Czy istnieje sposób, aby uzyskać wskaźnik funkcji członka do konstruktora kopiowania klasy? Wiem, jak zdefiniować i użyć normalnego wskaźnika funkcji członka, ale nie mogę wymyślić sposobu, aby go uzyskać.Jak mogę uzyskać wskaźnik funkcji członka do konstruktora kopiowania klasy?
Odpowiedz
Zgodnie ze standardem C++ "adres konstruktora nie zostanie wzięty", więc nie można zrobić tego, o co prosisz. Istnieje jednak proste obejście tego problemu. Poniższy kod zwraca wskaźnik funkcji do funkcji, która tworzy kopię jego danych wejściowych.
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;
}
Alternatywnie: (uproszczenie, które obejmuje również dodatkowe przypadki użycia)
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;
}
Jedyne brakujące wiersze to #include
[Nieważne] (http://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this). Nauczyłem się czegoś nowego dzisiaj. – StoryTeller
Znak + nie powinien być konieczny, nie wiesz, dlaczego on tam jest? Powinien wyzwolić niejawną konwersję po powrocie bez niej. –
- 1. Klasa wskaźnik funkcji członka
- 2. O sizeof z funkcji członka klasy wskaźnik
- 3. Zwracanie funkcji wskaźnik-do-członka (bez typedefs)
- 4. Jak wywołać wskaźnik funkcji członka?
- 5. wskaźnik do członka klasy jako parametr szablonu
- 6. Przeciążone wskaźnik funkcji członka do szablonu
- 7. C++ Wskaźnik do członka członka
- 8. wskaźnik do członka zamieszanie
- 9. wskaźnik do const funkcji członka typedef
- 10. wskaźnik funkcji członka w konstruktorze
- 11. Jak zadeklarować członka jako wskaźnik do zewnętrznej funkcji "C"?
- 12. Jak uzyskać wywołanie konstruktora kopiowania za pomocą konstruktora variadic?
- 13. Wywołanie konstruktora członka klasy w konstruktorze
- 14. Jak hashować i porównywać funkcję wskaźnik-do-członka?
- 15. rodzajowe wskaźnik funkcji członka jako parametr szablonu
- 16. Wywołanie wskaźnik do członka funkcja C++
- 17. Wywołanie funkcji członka z konstruktora JavaScript
- 18. Implementacja funkcji członka podstawowego za pomocą wskaźnika funkcji członka do funkcji wirtualnej
- 19. Czy mogę wywołać jawnie konstruktora kopiowania?
- 20. O wskaźnik do funkcji składowej klasy pochodnej
- 21. Jak wywołać konstruktora kopiowania klasy podstawowej z konstruktora kopii klasy pochodnej?
- 22. Wskaźnik funkcji C++ (element członkowski klasy) do funkcji elementu niestacjonarnego
- 23. Pośrednio nazywając kopiowania konstruktora
- 24. Wywołanie funkcji czystej wirtualnej z funkcji członka abstrakcyjnej bazy klasy?
- 25. Jak uzyskać dostęp do członka klasy z funkcji w klasie metody w maszynopisie
- 26. Jak mogę uzyskać wskaźnik do pierwszego elementu w std :: vector?
- 27. Apple GCC 4.2.1 przekazuje wskaźnik do konstruktora
- 28. Specjalizacja matrycy funkcji członka w szablonie klasy
- 29. mogę uzyskać wskaźnik do aktualnej wartości iteratora
- 30. std :: wiążą z funkcji członka klasy
Nie możesz. Konstruktory nie mają nazw. –
Nie możesz, ale w zależności od tego, co chcesz zrobić, możesz znaleźć obejście, używając lamdy. To znaczy. umieszczenie go w lamdzie. – Makaronodentro
To brzmi jak [problem XY] (http://xyproblem.info/). Załóżmy, że jakoś udało się uzyskać wskaźnik do konstruktora (nie, że można) - w jaki sposób można go użyć? Jaki jest faktyczny problem, który próbujesz rozwiązać? –