采用以下模板结构:
template<int n, typename... Ts>
struct Widget {};
如何针对sizeof...(Ts) == n
的情况专门化它?例如。 Widget<3, int, char>
应解析为主模板,但Widget<3, int, char, double>
应解析为专业化。
我尝试使用通常的SFINAE模式,但问题是模板参数包必须是最后一个模板参数,因此在typename... Ts
之后无法插入SFINAE检查。
答案 0 :(得分:3)
您可以使用辅助类:
List<A> result = new ArrayList<>(map.values());
事实上,您的案例可以直接完成:
// for your primary template
template<int n, bool b, class... Ts>
struct Widget_impl {};
// for your specialization
template<class... Ts>
struct Widget_impl<sizeof...(Ts), true, Ts...> {};
template<int n, typename... Ts>
using Widget = Widget_impl<n, n == sizeof...(Ts), Ts...>;
因为// for your primary template
template<int n, class... Ts>
struct Widget {};
// for your specialization
template<class... Ts>
struct Widget<sizeof...(Ts), Ts...> {};
已经是专业化的情况。
答案 1 :(得分:2)
您无法在
struct A{ std::tuple<double, double> t; };
之后插入SFINAE支票,但您可以在之前插入:
typename... Ts
然后,您可以将其别名:
template<typename AlwaysVoid, int n, typename... Ts>
struct WidgetImpl {};
// ...
template <int n, typename... Ts>
struct WidgetImpl<std::enable_if_t<sizeof...(Ts) == n>, n, Ts...> {
// ...
};