Comeau не нравится auto
как тип возвращаемого значения верхнего уровня, но следующие успешно компилируются:
template <typename R, typename C, typename A1> R get_return_type(R (C::*)(A1));
struct A
{
int f(int);
decltype(get_return_type(&A::f)) g(int x);
};
По сути, вы должны объявить хотя бы одну дополнительную конструкциюэто дает вам тот тип, который вы хотите.И используйте decltype
напрямую.
РЕДАКТИРОВАТЬ: Между прочим, это прекрасно работает для погружения в возвращаемый тип функции-члена:
template <typename R, typename C, typename A1> R get_return_type(R (C::*)(A1));
struct B { int f(int); };
struct A
{
int f(int);
B h(int);
decltype(get_return_type(&A::f)) g(int x);
decltype(get_return_type(&A::h).f(0)) k(int x);
};
int main()
{
return A().k(0);
}
Конечно, он не имеетто же удобство auto f()-> ...
, но, по крайней мере, компилируется.