c – 如何使用可变模板参数enable_if一个类?
发布时间:2020-12-16 05:21:38 所属栏目:百科 来源:网络整理
导读:假设我有一个具有以下签名的类: template typename T,typename... Argsclass A; 但是,这个类的行为应该取决于一些其他参数,我们假设它是T :: value的值: template typename T,typename... Args,typename Enableclass A;template typename T,typename = typ
假设我有一个具有以下签名的类:
template <typename T,typename... Args> class A; 但是,这个类的行为应该取决于一些其他参数,我们假设它是T :: value的值: template <typename T,typename... Args,typename Enable> class A; template <typename T,typename = typename std::enable_if<T::value>::type> class A { // do something }; template <typename T,typename = typename std::enable_if<!T::value>::type> class A { // do something else }; int main() { return 0; } 但是,该程序提供以下错误:
我一直在努力寻找关于使用enable_if来选择具有可变模板的类的一个很好的信息源.我唯一能找到的问题是这个: How to use std::enable_if with variadic template 但是,尽管这个名字,这个问题及其答案并没有多大帮助.如果有人可以提供或链接关于如何接近的指南,以及为什么不赞赏. 解决方法
首先,您正在尝试的是编写类模板的多个定义.这是不允许的,因为它违反了一个定义规则.如果要使用类进行条件启用,则需要专门化.此外,编译器错误消息已经告诉你,在参数列表的中间不能有一个可变参数包.
一种方法是: namespace detail { template<typename T,typename Enable,typename... Args> class A_impl; template<typename T,typename... Args> class A_impl<T,typename std::enable_if<T::value>::type,Args...> { // code here }; template<typename T,typename std::enable_if<!T::value>::type,Args...> { // code here }; } template<typename T,typename...Args> class A : public detail::A_impl<T,void,Args...> {}; 如果条件真的是一个bool,那么Jonathan’s way也是非常好的,但是如果你希望添加更多的专业化,这些专业化依赖于几个条件,这可能并不有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |