Подтвердить что ты не робот

Есть ли способ получить возвращаемый тип "текущей функции",

Я хотел бы написать шаблон, который получит в качестве параметра возвращаемый тип функции, в которой он создается.

Например, предположим, что у меня есть шаблон Result templated:

template<type T>
class Result {
    T _result_value;
    T& operator=( T that );
    ~Result( );
}

Для этого класса будет несколько специализаций. В деструкторе я хотел бы записать возвращаемый тип, и в рамках назначения operator= я хотел бы проверить и утвердить значения ошибок.

В идеале я хотел бы иметь такое определение:

#define RESULT Result< /* decltype magic for type of current function */ >

чтобы я мог использовать его:

HFILE MyOpenFile( ... ) {
    RESULT result;
}

..., который будет выведен на Result<HFILE>. Это упрощенный пример: запись Result вместо Result<HFILE> не имеет большого значения, но есть и другие сценарии, где возвращаемый тип текущей функции нелегко получить.

4b9b3361

Ответ 1

Нет. В С++ ничего не говорится о "текущей функции". Ближайшим является __func__, но это строковый литерал. Следовательно, нет ничего, чтобы перейти к decltype.

Не то, чтобы вам это нужно, с auto.

Ответ 2

Это невозможно изнутри функции, потому что в памяти нет выделенного объекта в памяти, на который можно ссылаться, чтобы вывести тип. Это возможно для классов, через decltype(*this).

Ответ 3

Самый портативный способ, который я могу придумать, - использовать decltype:

#define RESULT(func, ...) Result<decltype(func(__VA_ARGS__))>

int main(int argc, char **argv) {
    RESULT(main, argc, argv) result; // same as `Result<int> result;`
}

Но это заставляет вас передавать имя функции и каждый аргумент, который требуется для макроса RESULT. Я не думаю, что этого можно избежать, потому что нет возможности переносить (и часто даже не на компилятор) способ получения идентификатора текущей функции и/или переданных аргументов. Аргументы передавались из-за перегруженности неоднозначностей.

Вот SSCCE: http://ideone.com/cPTjjF