[英]auto template class enable_if valid arguments
如果傳入模板的 function 不包含有效的 arguments,我將如何使用 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)>() { }
};
您可以使用幫助程序 function 來檢查所有 arguments 是否有效。
template <typename R, typename ... Args>
static auto are_args_valid(R(*)(Args...))
{
return std::bool_constant<(true && ... && is_Valid_Arg_Type<Args>::value)>{};
}
在上面的幫助程序 function 中,我使用折疊表達式來檢查每個參數類型是否有效。
然后可以在enable_if
中使用它來檢查是否所有 arguments 都有效,就像這樣
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 的演示。
部分專業化可能會對您的情況有所幫助,與基本 class 的方式大致相同:
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 嘗試也失敗了,因為 class 已修復條件,產生硬錯誤而不是 SFINAE。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.