簡體   English   中英

自動模板 class enable_if 有效 arguments

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM