Есть ли способ получить тип возвращаемого значения & quot; текущей функции & quot;

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

Например, предположим, что я 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> это не страшно, но есть и другие сценарии, в которых тип возвращаемой функции не так просто получить.

13

Решение

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

Не то, что вам нужно, с auto,

4

Другие решения

Это невозможно изнутри функции, потому что в памяти нет выделенного объекта, представляющего ее, на который можно ссылаться для вывода типа. Это возможно для классов, через 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

3
По вопросам рекламы [email protected]