En este answer di, tenía sentido utilizar this
y el atributo de la clase _arg
en el tipo de retorno de arrastre como parte de la expresión decltype
. Es posible prescindir, pero inconveniente.¿Usando esto y atributos en la función de miembro detrás de los tipos de devolución?
Ni el clang 3.0 (véase a continuación) ni el gcc 4.5.2 lo aceptaron sin embargo.
#include <iostream>
class MyClass {
public:
MyClass(int i): _arg(i) {}
template <typename F>
auto apply(F& f) -> decltype(f(_arg)) {
return f(_arg);
}
template <typename F>
auto apply(F& f) -> decltype(f(*this, _arg)) {
return f(*this, _arg);
}
private:
int _arg;
};
struct Id {
template <typename V>
V operator()(V v) const { return v; }
};
struct ComplexId {
template <typename C, typename V>
V operator()(C const&, V v) { return v + 1; }
};
int main() {
Id id; ComplexId complex;
MyClass c(0);
std::cout << c.apply(id) << " " << c.apply(complex) << "\n";
}
sonido metálico 3.0 dice:
$ clang++ -std=c++11 -Weverything test.cpp
test.cpp:8:38: error: use of undeclared identifier '_arg'
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:8:45: error: type name requires a specifier or qualifier
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:8:45: error: C++ requires a type specifier for all declarations
auto apply(F& f) -> decltype(f(_arg)) {
~~~~~~~~ ^
test.cpp:8:7: error: 'auto' return without trailing return type
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:13:39: error: invalid use of 'this' outside of a nonstatic member function
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
test.cpp:13:52: error: type name requires a specifier or qualifier
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
test.cpp:13:52: error: C++ requires a type specifier for all declarations
auto apply(F& f) -> decltype(f(*this, _arg)) {
~~~~~~~~ ^
test.cpp:13:7: error: 'auto' return without trailing return type
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
8 errors generated.
Hum ... no es tan grande.
Sin embargo, el soporte de C++ 11 es hacky en el mejor de los casos en la mayoría de los compiladores y no pude encontrar restricciones específicas mencionadas en el Estándar (n3290).
En los comentarios, Xeo sugirió que podría haber sido un defecto en la Norma ...
Por lo tanto, se esta permitido o no?
Bonificación: y ¿hay versiones más recientes de clang/gcc compatibles?
Clang 3.1 HEAD arroja los mismos errores. – Xeo
Errores similares en GCC 4.7. –
Por cierto, acabo de encontrar [esta pregunta interesante y similar] (http://stackoverflow.com/q/7255379/500104). Además, con la sugerencia de @Johannes de declarar al miembro por adelantado, solo obtengo un error sobre 'this' en el tipo de devolución final, no sobre' _arg' con Clang 3.1 HEAD. – Xeo