如何为特定数量的模板参数

时间:2018-03-05 21:56:35

标签: c++ c++11 templates metaprogramming variadic-templates

采用以下模板结构:

template<int n, typename... Ts>
struct Widget {};

如何针对sizeof...(Ts) == n的情况专门化它?例如。 Widget<3, int, char>应解析为主模板,但Widget<3, int, char, double>应解析为专业化。

我尝试使用通常的SFINAE模式,但问题是模板参数包必须是最后一个模板参数,因此在typename... Ts之后无法插入SFINAE检查。

2 个答案:

答案 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...> {
    // ...
};