Ответ 1
Нет. В С++ ничего не говорится о "текущей функции". Ближайшим является __func__
, но это строковый литерал. Следовательно, нет ничего, чтобы перейти к decltype
.
Не то, чтобы вам это нужно, с auto
.
Я хотел бы написать шаблон, который получит в качестве параметра возвращаемый тип функции, в которой он создается.
Например, предположим, что у меня есть шаблон 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>
не имеет большого значения, но есть и другие сценарии, где возвращаемый тип текущей функции нелегко получить.
Нет. В С++ ничего не говорится о "текущей функции". Ближайшим является __func__
, но это строковый литерал. Следовательно, нет ничего, чтобы перейти к decltype
.
Не то, чтобы вам это нужно, с auto
.
Это невозможно изнутри функции, потому что в памяти нет выделенного объекта в памяти, на который можно ссылаться, чтобы вывести тип. Это возможно для классов, через decltype(*this)
.
Самый портативный способ, который я могу придумать, - использовать 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