Czy istnieje sposób zbudowania typedef
wewnątrz deklaracji typu na zadeklarowanym (otaczającym) typie bez podawania nazwy typu?Typedef do otaczającego typu w C++
przykład:
class X
{
public:
typedef <fill in magic here> MyType;
//...
};
Tło: Wydaje głupie na pierwszy rzut oka. Potrzebuję tego, ponieważ używam makr do kompilacji w czasie moich klas danych. Tak więc w deklaracji klasy danych znajduje się makro, które musi zajmować się typem, w którym jest wstawiane. Do tej pory znalazłem rozwiązania robocze dla MSVC i g ++, które polegają na tym, co uważam za wadę w implementacji. Mogą więc nie działać w nowszej wersji. Clang nie "je" ani jednego z tych rozwiązań.
Moje obecne rozwiązanie dla MSVC definiuje metodę, a następnie przyjmuje adres tylko według jej nazwy i wywołuje małego pomocnika, który "zwraca" typ swojej klasy. (Clang i g ++ oczekują pełnej nazwy metody, włącznie z jej nazwą klasy).
Moje obecne rozwiązanie dla g ++ definiuje metodę statyczną z typem powrotu std::remove_reference(decltype(*this))
. (Clang i MSVC nie pozwalają na this
w kontekście statycznym).
Bezwarunkowo wolałbym standardowe rozwiązanie, ale specjalne rozwiązanie dla klang również byłoby w tej chwili w porządku.
Jeśli nic nie działa, muszę podać nazwę klasy do makra, ale staram się tego uniknąć, ponieważ mam już dużo kodu przy użyciu makra.
EDIT: Dodanie próbki, w jaki sposób działa odbicie (który może wyjaśnić to, czego potrzebuję):
class X : public Y
{
public:
//.. constructor and such stuff...
int a;
double b;
std::string c;
CLASSHEAD(Y)
FIELD(a)
FIELD(b)
FIELD(c)
CLASSFOOT
};
CLASSHEAD
jest makro, które powinno określać typedef
. Jest to makro VAR_ARGS, w którym argumenty otrzymują klasy bazowe. Jak już wspomniano: możliwe jest nadanie mu nazwy klasy jako jej pierwszego argumentu (co daje w rezultacie CLASSHEAD(X, Y)
). Ale prawie nie można sobie wyobrazić, że nie ma rozwiązania do takiego „po prostu” zadanie jako typedef'ing otaczającą typ ...
Właściwie to nie jest dla mnie jasne, dlaczego nie można po prostu zrobić 'typedef X MyType;', a następnie mieć makra używające 'MyType'? – BoBTFish
Czy wszystkie klasy, które będą używać tego mechanizmu, będą dziedziczyć z tej samej bazy? (W takim przypadku mogę przywrócić moją odpowiedź CRTP). – BoBTFish
Jedyny powód, dla którego mogę myśleć o potrzebie tego, to podpisy funkcji. W samej funkcji używałbyś 'typedef std :: remove_reference (decltype (* this)) :: type MyType;' jak wyżej. Można utworzyć szablony funkcji, a następnie 'static_assert (std :: is_same :: value);'. Nie ładnie, nie można wymyślić nic lepszego. –
BoBTFish