2010-07-08 14 views
6

Jak mogę przejść do określenia typu zwrotu funkcji ogólnej członka?Szablon C++ określa funkcję zwracanego typu

template<class E> 
    struct result<E> { 
     // E has member function data(), I need to know its return type 
     typedef typename &E::data type; 
    }; 

czy można to zrobić w sposób ogólny? Wiem, że jest boost:: result_of, ale dla moich celów brakuje specjalizacji (jeśli dobrze rozumiem, typ zwrotu musi być wyspecjalizowany). Implementacja wzmocnienia byłaby świetna.

+2

Prawdopodobnie w ogóle nie potrzebujesz tej magii. Spróbuj użyć 'E :: value_type *' lub 'E :: point'. Jeśli ma "dane()", prawdopodobnie jest kontenerem i zapewnia publiczne typy. –

+0

@Johannes dziękuję. faktycznie próbował pisać opakowania, aby działały transparentnie z ublami i innymi rzeczami. Niestety, interfejs ublas data() jest nieco niestandardowy (array_type), więc ostatecznie wyspecjalizowałem go oddzielnie. – Anycorn

Odpowiedz

4

Operator niestandardowy GCC typeof może to zrobić, podobnie jak Boost.TypeOf.

+0

, który wydaje się działać, o ile nie ma przeładowanych funkcji. Czy wiesz, jak sobie radzić z przypadkiem, w którym istnieją 2 funkcje (jedna ma kwalifikator const)? – Anycorn

+0

Będziesz musiał typować polecenie funkcji do typu const lub non const przed jej użyciem. Ten sam problem występuje w przypadku boost :: bind. – bradgonesurfing

+0

@brad dziękuję. Czy nie muszę znać typu zwrotu przed typem rzutowania? możesz podać przykład? – Anycorn

3

Jeśli używasz VS2010 lub GCC 4.3 przynajmniej możesz użyć C++ 0x nowe słowo kluczowe decltype.

Powiązane problemy