我有一个函数对象,可以将任何类型静态转换为特定类型,定义如下:
template <typename T_Out>
struct cast_to {
template <typename T_In>
T_Out operator()(T_In&& value) const noexcept {
return static_cast<T_Out>(value);
}
};
现在,我想将函数对象的使用限制为那些被声明为 noexcept
的静态转换表达式。这个想法是在 operator()
函数中添加一些静态断言。到目前为止,我已经尝试了两个 constexpr 表达式:
std::is_nothrow_constructible<T_Out, decltype(value)>::value
并且
noexcept(static_cast<T_Out>(value))
这两种方法都可以按照我的期望工作(实际上,我已经发现第一个检查也包括了另一个,在GCC上至少是这样)。我应该选择哪种方法?是否还有更好的替代方案?