【问题标题】:Return default constructed or void from template function从模板函数返回默认构造或无效
【发布时间】:2019-09-12 07:40:01
【问题描述】:

我有一个用异常处理包装另一个调用的函数。大多数调用不会返回任何内容(void),但对于某些调用,函数可能会返回 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

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

【问题讨论】:

  • member_function_trait&lt;decltype(f)&gt;::ret()?
  • @geza 似乎不适用于void- 给出错误:错误 C2440: '': cannot convert from 'initializer list' to 'void (void)'
  • @darune 我认为你混淆了member_function_trait&lt;decltype(f)&gt;::ret()member_function_trait&lt;decltype(f)&gt;::ret{}
  • 你是如何使用它的?
  • 我认为你有一个错误。在member_function_trait 中,R 不是返回类型。至少,如果你用成员函数实例化它,它将是一个函数类型。

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


【解决方案1】:

首先,你的 trait 不太正确,因为 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]

【讨论】:

  • 当我尝试得到“错误 C2672: 'default_constructed': 找不到匹配的重载函数”
  • @darune 因为你的特质是错误的;答案已编辑。
  • 为什么是default_constructed?是不需要的。 return void(); 是一个完全有效的表达式。
  • 是的,default_constructed 不需要,除非你不想/需要大括号初始化
  • @darune: open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1114r0.html#2351 这在标准中已修复,但尚未有主要编译器实施此修复。
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 2014-05-18
  • 2011-03-27
  • 2016-03-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 2013-02-03
相关资源
最近更新 更多