2012-02-05 23 views
5

Zastanawiam się, czy ktoś wie, jakie ograniczenia dotyczą operatora konwersji/typecast?Czy istnieją jakieś ograniczenia dotyczące typów operatora typograficznego?

Tak więc, na przykład, może mieć następujące podmioty ręczne:

class Test { 
    operator int() { return 0; }; 
    operator int*() { return nullptr; }; 
} 

Dla zwykłego funkcji, mogę również mieć wskaźnik do typu tablicy. Na przykład.

int (*MyFunc())[4] { return nullptr; }; 

Jednak nie wiem jak to zrobić to samo dla operatora konwersji (lub jeśli jest to nawet zgodne z prawem). Próbowałem kilka różnych odmian i VS2010 i żaden nie działa. (Takie jak :)

operator int (*())[4] { return nullptr; }; 
operator int(*)[4]() { return nullptr; }; 

Nie jestem pewien, czy jest to ograniczenie w VS2010 lub jeśli istnieje ogólny limit typów, które mogą być stosowane w operatora konwersji. Próbowałem szukać standardu online bez powodzenia. Czy ktoś wie? Zanim ktokolwiek zapyta "dlaczego chciałbyś to zrobić", to jest to automatycznie wygenerowany kod. Chociaż nie oczekuję, że otrzymam wskaźnik do wprowadzenia tablicy, chciałbym móc stworzyć kod, jeśli jest legalny w C++.

Odpowiedz

3

Tak, istnieją ograniczenia. Ograniczenie, które uderzyło tablicami, wynika z gramatyki języka. Specyfikacja gramatyka dla operatora konwersji (i KIN) przedstawia się następująco:

 
§12.3.2 
conversion-function-id: 
    operator conversion-type-id 
conversion-type-id: 
    type-specifier-seq conversion-declarator[opt] 
conversion-declarator: 
    ptr-operator conversion-declarator[opt] 

§7.1.6 
type-specifier: 
    trailing-type-specifier 
    class-specifier 
    enum-specifier 
trailing-type-specifier: 
    simple-type-specifier 
    elaborated-type-specifier 
    typename-specifier 
    cv-qualifier 
type-specifier-seq: 
    type-specifier attribute-specifier-seq[opt] 
    type-specifier type-specifier-seq 
trailing-type-specifier-seq: 
    trailing-type-specifier attribute-specifier-seq[opt] 
    trailing-type-specifier trailing-type-specifier-seq 

Zostawiam to jako ćwiczenie dla czytelnika, aby spojrzeć na wszystkie te, ale nie można określić jako tablicę typu bezpośrednio. (. Jest ona określona wyłącznie w deklaracji) Na szczęście, choć typedef-name jest dozwolone (poprzez TypeName-specyfikacją), a ponieważ typedef jest rodzajem deklaracji, macierze pracują tam:

struct Test { 
    typedef int operator_type[4]; 

    operator operator_type*() { return nullptr; }; 
}; 

Krótko mówiąc, użyj typedef i możesz użyć dowolnego typu.

+0

Dzięki. Tak właśnie odpowiedziałem na moje pytanie. –

+0

Komentarz na dole strony? – GManNickG

6

Należy Najczęściej typedef w twardej konstrukcji, także masz składni złego,

operator Type() {}

będę Użyj typedef s chociaż

typedef int (*foo())[4]; 
typedef int(*bar)[4]; 

pomocą typedef

operator foo() { return nullptr; } // tutaj próbujesz przekonwertować nullptr do "funkcja", która zwraca wskaźnik do tablicy 4 int, co oczywiście jest błędne.

operator bar() { return nullptr; } // twoje drugie nawrócenie jest ważne jednak, ponieważ jesteś konwersji nullptr do wskaźnik do tablicy z 4 int s

+0

Tak, miałem nadzieję uniknąć użycia typedef, ale myślę, że nie ma wyboru. –

Powiązane problemy