Я хотел бы написать шаблон, который бы получал в качестве параметра возвращаемый тип функции, в которой он создается.
Например, предположим, что я Result
шаблонный класс:
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>
это не страшно, но есть и другие сценарии, в которых тип возвращаемой функции не так просто получить.
Нет. В C ++ нет ничего, что относилось бы к «текущей функции». Ближайший __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