自动模板类enable_if有效参数

auto template class enable_if valid arguments

本文关键字:if 有效 参数 enable      更新时间:2023-10-16

如果传递到模板中的函数不包含有效参数,我将如何使用enable_if来禁用构造函数。

template <typename SrcType>
using is_Valid_Ret_Type = std::bool_constant<
std::is_same<SrcType, void>::value |
std::is_same<SrcType, int>::value>;
template <typename SrcType>
using is_Valid_Arg_Type = std::bool_constant<
std::is_integral<SrcType>::value /*|
std::is_same<SrcType, float>::value*/>;
template<typename Fn> class FunctionBase;
template<typename R, typename... Args>
class FunctionBase <R(__cdecl*)(Args...)>
{
// ......
};
template <auto F>
class Function : public FunctionBase<decltype(F)> {
public:
template <typename R, typename... Args>
static R return_type_of(R(*)(Args...)) {};
template<
typename = std::enable_if_t<is_Valid_Ret_Type<decltype(return_type_of(F))>::value>,
typename = std::enable_if_t<(is_Valid_Arg_Type<Args>::value&& ...)>> // how do I do this
Function() : FunctionBase<decltype(F)>() { }
};

部分专用化可能会对您有所帮助,与基类大致相同:

template <auto F>
class Function;
template <typename R, typename... Args, R (*F)(Args...)>
class Function<F> : public FunctionBase<decltype(F)> {
public:
static_assert(is_Valid_Ret_Type<R>::value);
static_assert((true && ... && is_Valid_Arg_Type<Args>::value));
Function() : FunctionBase<decltype(F)>() { }
};

您的 SFINAE 尝试也失败了,因为该类已修复条件,产生硬错误而不是 SFINAE。

可以使用帮助程序函数来检查所有参数是否有效。

template <typename R, typename ... Args>
static auto are_args_valid(R(*)(Args...))
{
return std::bool_constant<(true && ... && is_Valid_Arg_Type<Args>::value)>{};
}

在上面的辅助函数中,我使用折叠表达式来检查每个参数类型是否有效。

然后可以在enable_if内部使用它来检查所有参数是否有效,如下所示

template<
typename = std::enable_if_t<is_Valid_Ret_Type<decltype(return_type_of(F))>::value>,
typename = std::enable_if_t<decltype(are_args_valid(F))::value>>
Function() : FunctionBase<decltype(F)>() { }

这是一个关于 golbolt 的演示。