带有可变参数非类型参数的模板专业化

问题描述 投票:0回答:1

我正在尝试检测类型是否为A类型(带有任何模板参数)。我正在使用一个辅助结构和模板专用化。我做了以下事情:

#include <iostream>

template<typename,typename,typename,typename,int... pars> struct A{};

template<typename T> struct check: std::false_type{} ;

template<typename... T>
struct check<A<T...>> : std::true_type{}; // specialization is not applied

template<typename... T, int... pars>
struct check<A<T...,pars...>> : std::true_type{}; // same

// the following would get applied for any A:

// template<typename T1, typename T2, typename T3, typename T4, int... pars> 
// struct check<A<T1,T2,T3,T4,pars...>> : std::true_type{};

int main(){
    std::cout << check<A<int,char,double,int,1,2,3>>::value << std::endl;
}

但是,它将打印出0,因此不应用未注释的专业。它不应该工作还是我在这里错过了一些东西?是否有类似或替代的方法来检测任何类型A,而不必像上面的注释行一样写出类A的所有typename T1等?

c++ templates variadic-templates template-specialization
1个回答
0
投票

即使我们的大脑可以在非类型的参数包旁边推断出类型的参数包,编译器也不愿意尝试找出一个参数包在哪里结束而另一个在哪里开始。

通常,混合好可变数量的类型和非类型参数只是一种好方法。通常的解决方法是,如果可以修改A,则将非类型参数提升为类型:

template <int... pars>
using make_pars = std::integer_sequence<int, pars...>;

然后,检查要简单得多

template <typename... Ts>
struct check : std::false_type {};

template <typename... Ts>
struct check<A<Ts...>> : std::true_type {};

并且使用时没有太多额外的样板:

std::cout << check<A<int,char,double,int,make_pars<1,2,3>>>::value << std::endl;

演示:https://godbolt.org/z/7pMp2e

© www.soinside.com 2019 - 2024. All rights reserved.