【发布时间】: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<decltype(f)>::ret()? -
@geza 似乎不适用于
void- 给出错误:错误 C2440: '': cannot convert from 'initializer list' to 'void (void)' -
@darune 我认为你混淆了
member_function_trait<decltype(f)>::ret()和member_function_trait<decltype(f)>::ret{}。 -
你是如何使用它的?
-
我认为你有一个错误。在
member_function_trait中,R不是返回类型。至少,如果你用成员函数实例化它,它将是一个函数类型。
标签: c++ templates c++17 template-meta-programming invoke-result