我正在编写一个宏,当用于包装像这样的函数调用时:macro(function())返回 a std::optional<T>,其中 T 是函数的返回值。到目前为止它可以工作,但是std::optional<bool>当函数没有返回类型(即它返回void)时,我试图让它返回a时遇到了问题。
问题的核心是编译器尝试评估 if-constexpr 的范围,当函数没有返回类型时,该 if-constexpr 的计算结果为 false。
我尝试使用两个 if-constexpr 和一个 else。我尝试内联所有内容并将其展开几行。我尝试用常量文字替换编译器计算的 constexpr 常量。到目前为止没有任何效果。
我现在拥有的宏如下所示:
#ifndef troy
#define troy(body)[](){\
constexpr auto inner_type_is_void=std::is_same<decltype(body), void>::value;\
using inner_type=std::conditional<inner_type_is_void,bool,decltype(body)>::type;\
try{\
if constexpr (inner_type_is_void) {(body); return std::optional<inner_type>{true};}\
if constexpr (!inner_type_is_void) {return std::optional<inner_type>{(body)};}\
} catch (...){\
return std::optional<inner_type>{};\
}\
}()
#endif
Run Code Online (Sandbox Code Playgroud)
我像这样使用它:
{
auto a=troy(f());
if (!a){
std::cout << "fail" << std::endl;
} else{
std::cout << "success: " << *a << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
它在 f 返回一个值时工作,但在不返回时给出编译器错误。此编译器错误是:no …