Вернуть построенный по умолчанию или недействительный из функции шаблона

У меня есть функция, которая обертывает другой вызов обработкой исключений. Большинство вызовов ничего не возвращает (void), но для некоторых вызовов функция может возвращать int или тому подобное. Это отлично работает, за исключением того, что я борюсь с возвращаемым значением по умолчанию илиreturn void.

Я сейчас смотрю на что-то вроде следующего

template<class T> struct member_function_trait;
template<class T, class R> struct member_function_trait<R T::*> { using type = T; using ret = R; };



template<auto f, class T, typename... Args>
auto DispatchImpl(T* obj, Args&&... args) {
  try {
    return (static_cast<typename member_function_trait<decltype(f)>::type*>(obj)->*f)(std::forward<Args>(args)...);
  }
  catch (std::runtime_error& e) {
    //handled exception
  }
  return member_function_trait<decltype(f)>::ret; //<--- how to return default constructed or 'void' here ?
}

Ошибка компиляции:

error C2275: 'member_function_trait<void (__cdecl MyClass::* )(void)>::ret': illegal use of this type as an expression

Я застрял в том, как решить проблему. Я не замечаю какой-нибудь простой трюк? (Я надеюсь, что это так)

1 ответ

Решение

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

template<class T, class R, class... A>
struct member_function_trait<R (T::*)(A...)>
{
  using type = T;
  using ret = R;
};

После этого просто создавая ret() даст вам именно то, что вы хотите:

// In DispatchImpl:
return typename member_function_trait<decltype(f)>::ret();

[Живой пример]

Другие вопросы по тегам