gpt4 book ai didi

c++ - 具有可变参数模板的模糊部分模板特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:44 25 4
gpt4 key购买 nike

对于下面的代码:

template <typename T>
struct IsOneOf<T,T> { const static bool True = true; };
template <typename T, typename ... Ts>
struct IsOneOf<T,any_of<T,Ts ...> > { const static bool True = true;};
template <typename T, typename T2,typename ... Ts>
struct IsOneOf<T,any_of<T2,Ts ...> > {
const static bool True = IsOneOf<T,T2>::True ||
IsOneOf<T,any_of<Ts ...> >::True;
};
template <typename T1, typename ... Ts1, typename ... Ts2>
struct IsOneOf< any_of<T1,Ts1 ...>, any_of<Ts2 ...> > {
const static bool True = IsOneOf<T1,any_of<Ts2 ...> >::True &&
IsOneOf<any_of<Ts1...>, any_of<Ts2 ...> >::True;
};

最后一个特化旨在覆盖其他特化,但我收到 IsOneOf<any_of<int>,any_of<int,double,float>>::True 的模棱两可的模板实例化错误.有人可以建议一种方法来克服这个问题吗?

最佳答案

最后的专业IsOneOf<any_of<T1,Ts1...>, any_of<Ts2...>>不比 IsOneOf<T,any_of<T2,Ts...>> 更专业因为如果 Ts2是一个空列表,它不能匹配后者。我想你想要这个,可以代替或补充你最后的专业:

template <typename T1, typename ... Ts1, typename T2, typename ... Ts2>
struct IsOneOf< any_of<T1,Ts1 ...>, any_of<T2,Ts2 ...> >
{
const static bool True = IsOneOf<T1, any_of<T2,Ts2...>>::True &&
IsOneOf<any_of<Ts1...>, anyOf<T2,Ts2...>>::True;
};

IsOneOf<any_of<int,double>, any_of<int,double>> 也会有问题因为在那种情况下你的 IsOneOf<T,T>对于这种一般情况是模棱两可的。所以你可以通过指定交叉点来切断它:

template <typename T1, typename ... Ts>
struct IsOneOf< any_of<T1,Ts ...>, any_of<T1,Ts ...> >
{
const static bool True = true;
};

您还需要处理 any_of<> 类型的基本案例,如果您还没有它们。

关于c++ - 具有可变参数模板的模糊部分模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26721865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com