Вы не можете создать локальную функцию в C ++.Вы можете создать локальный тип объекта и определить / вызвать его operator()
, или использовать лямбду, но в этот момент вы также можете поместить его наружу как реальную функцию:
template <typename TypeRet, typename... Args>
TypeRet empty_function(Args... args) {
return TypeRet();
}
template <typename Function, typename... Args>
void foo(Args... args) {
empty_function<decltype( std::declval<Function>()(args...) )>(args...);
}
(рассмотрите возможность добавленияstd::forward
, по желанию.)
Обратите внимание, что любой стоящий компилятор удалит вызов, даже если он помечен как недействительный.Это потому, что, хотя функция не является встроенной, она ничего не делает, и поэтому может быть исключена полностью.Вы можете обойти это несколькими способами, но использование переменной volatile
переносимо на Clang, GCC, ICC и MSVC:
#ifdef _MSC_VER
#define NOINLINE __declspec(noinline)
#else
#define NOINLINE __attribute__((noinline))
#endif
template <typename TypeRet, typename... Args>
NOINLINE TypeRet empty_function(Args... args) {
TypeRet volatile a = TypeRet();
return a;
}
Смотрите вживую.