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