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();
我有一个函数用异常处理包装另一个调用。大多数调用不会 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();