簡體   English   中英

部分模板專業化SFINAE

[英]Partial Template Specialization SFINAE

我有以下類模板:

template<bool head, bool... tail> 
struct var_and {
    static constexpr bool value = head && var_and<tail...>::value;
};

template<bool b> struct var_and<b> {
    static constexpr bool value = b;
};

template<typename... Ts>
struct type_list {};

template <typename T, typename Enable = void>
class foo;

template <typename... T>
class foo<type_list<T...>, std::enable_if_t<var_and<std::is_integral_v<T>...>::value>> {};

當我嘗試匹配專業化時:

foo<type_list<int, int, int>> test{};

我收到一個錯誤:

Error C2079 'test' uses undefined class 'ECS::foo<ECS::type_list<int,int,int>,void>'

同時我收到這些錯誤:

more than one partial specialization matches the template argument list of class "ECS::foo<ECS::type_list<int, int, int>, void>" 
"ECS::foo<ECS::type_list<T...>, std::enable_if_t<ECS::var_and<std::is_integral_v<T>...>::value, void>>"          
"ECS::foo<ECS::type_list<T...>, std::enable_if_t<ECS::var_and<std::is_integral_v<T>...>::value, void>>"
... (The exact same error message 6 more times)

如何專門使用SFINAE來強制執行可變參數類型包中類型的類型特征?

我可以毫不費力地為單一類型的論證工作: http//www.cppsamples.com/common-tasks/class-template-sfinae.html

我知道我可以簡單地使用static_assert,但我想知道是否也可以沒有。

解決方法可能如下所示:

#include <type_traits>

template <bool...>
struct bool_pack { };

template <bool... Bs>
using var_and = std::is_same<bool_pack<true, Bs...>, bool_pack<Bs..., true>>;

template<typename... Ts>
struct type_list {};

template <typename T, typename Enable = void>
class foo;

template <typename... T>
class foo<type_list<T...>, std::enable_if_t<var_and<std::is_integral<T>::value...>::value>> {};

int main()
{
    foo<type_list<int, int, int>> {};
}

[現場演示]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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