c++ - 从模板函数返回默认构造或无效

标签 c++ templates c++17 template-meta-programming invoke-result

我有一个函数用异常处理包装另一个调用。大多数调用不返回任何东西(void),但对于某些调用,函数可能返回 int 或类似的东西。这工作正常,除了我在 default 返回 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 将是函数类型,而不是它的返回类型。你可能是这个意思:

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]

关于c++ - 从模板函数返回默认构造或无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57901919/

相关文章:

c++ - 无法从 'char **' 转换为 'char *[]'

C++ 入门(第 5 版);第 19 章 - 算法:std::lower_bound

c# - 如何在 Visual Studio 中从 C++/CLI 和 C# 调用 C++/CLI?

c++ - 使用模板化接口(interface)导致 “Undefined reference to”

c++ - 将类型特征与可变参数模板参数一起使用

c++ - 什么时候考虑对不合格的从属名称进行ADL查找?

c++ - QT 向另一个 QT 应用程序发送信号?

c++ - 将一组类转换为类模板并避免构造函数歧义

c++ - 当定义为模板参数时,编译器如何推断数组大小?

c++ - 在 C++17 中使用 noexcept 的 std::function