Próbuję wpisać usunąć obiekt i wpadł trochę problem, który mam nadzieję, że ktoś tutaj może mieć wiedzę w.C++ typu usuwanie szablonu z wykorzystaniem funkcji lambdy
I haven” t miało problem z wymazywaniem dowolnych niesformatowanych funkcji; do tej pory to, co robiłem, tworzy niestandardową kolekcję wskaźników funkcyjnych "wirtualny stół" static
. To wszystko udało się bez przechwytywania lambdas, ponieważ rozpadają się na wskaźnikach wolnego funkcyjnych:
template<typename Value, typename Key>
class VTable {
Value (*)(const void*, const Key&) at_function_ptr = nullptr;
// ...
template<typename T>
static void build_vtable(VTable* table) {
// normalizes function into a simple 'Value (*)(const void*, const Key&)'' type
static const auto at_function = [](const void* p, const Key& key) {
return static_cast<const T*>(p)->at(key);
}
// ...
table->at_function_ptr = +at_function;
}
// ...
}
(Istnieje więcej funkcji pomocnika/aliasy, które zostały pominięte dla zwięzłości)
Niestety to samo podejście nie działa z funkcją template
.
Moim pragnieniem jest, by klasa typu skasowane mieć coś podobnego do następującego:
template<typename U>
U convert(const void* ptr)
{
return cast<U>(static_cast<const T*>(ptr));
}
gdzie:
cast
to darmowa funkcja,U
jest typ istota odlewane do,T
jest typem usuniętego typu, z którego są rzucane, iptr
jest wykasowanym typem wskaźnikiem, który podąża za tym samym idiomem powyżej dla typu wymazania.
[Edycja: Emisja powyżej jest to, że nie jest znany T
z funkcji convert
; jedyną funkcją, która wie o typie T
w tym przykładzie jest build_vtable
. Może to po prostu wymaga zmiany projektowe]
Powodem stało się wyzwaniem jest to, że nie wydaje się, aby w prosty sposób usunąć wpisać oba typy samodzielnie. Klasyczna/idiomatyczna technika usuwania typu klasy bazowej nie działa tutaj, ponieważ nie można uzyskać funkcji o wartości . Eksperymentowałem z modelem podobnym do odwiedzającego, z niewielkim powodzeniem dla podobnych przyczyn z powyższego.
Czy ktoś z doświadczeniem w usuwaniu typu ma jakieś sugestie lub techniki, które można zastosować, aby osiągnąć to, co próbuję zrobić? Korzystnie w zgodnym ze standardami kodzie C++ 14. A może jest tam zmiana projektu, która może ułatwić tę samą koncepcję, o którą tutaj chodzi?
Szukałem tej odpowiedzi od jakiegoś czasu i nie miałem szczęścia. Jest kilka przypadków, które są podobne do tego, co próbuję zrobić, ale często z wystarczającą różnicą, że rozwiązania nie wydają się dotyczyć tego samego problemu (proszę dać mi znać, jeśli się mylę!).
Wygląda na to, że większość odczyty/blogi na te tematy zwykle obejmują podstawowe techniki usuwania tekstu, ale nie to, czego szukam tutaj!
Dzięki!
Uwaga: nie polecam Zwiększenia. Znajduję się w środowisku, w którym nie mogę korzystać z ich bibliotek, i nie chcę, aby ta zależność była zależna od kodu.
Nie można "obsadzić" jako funktora, a następnie nazwać go "rzutowaniem" (znacznik {}, rzutowanie (znacznik {}, ptr)) '? –
Jarod42
@ Jarod42 Problem polega na tym, że 'T' nie jest znane z' convert ', więc nie jest tak proste jak stworzenie 'tagu' w tym miejscu. Jedyną funkcją w przykładzie, który zna typ 'T' jest' build_vtable' –
Bitwize
Po pierwsze, nie jest to funkcja 'template'; jest to funkcja 'szablon'.Konieczne jest tutaj sformułowanie słów. Tak więc nie jest to faktyczna funkcja. Faktyczna funkcja to 'convert ' jak opisuje Yakk. Dlatego będziesz potrzebować 'convert_U_function_ptr' w swoim' VTable' dla każdego 'U' type – zahir