我有一个函数用异常处理包装另一个调用。大多数调用不返回任何东西(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();
关于c++ - 从模板函数返回默认构造或无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57901919/