Return 默认从模板函数构造或无效

Return default constructed or void from template function

我有一个函数用异常处理包装另一个调用。大多数调用不会 return 任何东西(无效),但对于某些调用,函数可能 return 一个 int 或类似的。这工作正常,除了我在 default return val 或 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

我不知道如何处理这个问题。我忽略了一些简单的技巧吗? (希望如此)

首先,你的特征不太正确,因为 ret 将是函数类型,而不是它的 return 类型。你可能是这个意思:

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();

[Live example]