valores valor una retornar retorna referencia que multiples metodo funciones funcion devuelve devolver devolución con como arreglo c++ templates c++11 decltype

c++ - valor - Obtener el tipo de devolución de la función miembro sin un objeto



funciones en c (2)

No lo necesita: recuerde que dado que decltype no evalúa su argumento, puede simplemente invocar nullptr .

decltype(((T*)nullptr)->foo()) footype;

Tengo varias clases que no puedo modificar. Cada uno tiene un constructor de copia, al menos otro constructor y una función foo() que devuelve algún valor. Quiero hacer una plantilla de clase que pueda derivar de cada una de estas clases, y tenga un miembro de datos que sea del mismo tipo que el tipo de devolución de foo() (lo siento si tengo algo de la terminología incorrecta).

En otras palabras, me gustaría una plantilla de clase

template<typename T> class C : public T { footype fooresult; };

donde footype es el tipo de devolución de T::foo() .

Si todas las clases base tuvieran, digamos, un constructor predeterminado, podría hacer

decltype(T().foo()) fooresult;

(con la funcionalidad C ++ 0x en GCC) pero las clases no tienen ningún constructor particular en común, aparte de los constructores de copia.

GCC tampoco permite decltype(this->foo()) , aunque aparentemente existe la posibilidad de que esto se agregue al estándar C ++ 0x. ¿Alguien sabe qué tan probable es?

Siento que debería ser posible hacer algo en la línea de decltype(foo()) o decltype(T::foo()) pero parece que no funcionan: GCC da un error de la forma cannot call member function ''int A::foo()'' without object .

Por supuesto, podría tener un footype parámetro de plantilla footype , o incluso un parámetro de tipo no de clase, pero ¿hay alguna forma de evitar esto?


Otra alternativa es:

#include <utility> template<typename T> class C : public T { decltype(std::declval<T>().foo()) footype; };

declval devuelve un T&& . O si foo podría estar sobrecargado con calificadores de rvalue-ref, y desea asegurarse de obtener la sobrecarga lvalue de foo:

decltype(std::declval<T&>().foo()) footype;

En este ejemplo, declval devuelve un T& .

Como la solución ((T*)nullptr)-> , std::declval no impone requisitos en el tipo T