c – Variadic模板之谜
发布时间:2020-12-16 09:37:42 所属栏目:百科 来源:网络整理
导读:这是可行的代码: templatetypename... Args struct count;templatestruct count {static const int value = 0;};templatetypename T,typename... Argsstruct countT,Args... {static const int value = 1 + countArgs...::value;}; 现在我想知道为什么我们
这是可行的代码:
template<typename... Args> struct count; template<> struct count<> { static const int value = 0; }; template<typename T,typename... Args> struct count<T,Args...> { static const int value = 1 + count<Args...>::value; }; 现在我想知道为什么我们需要部分专门化计数类模板? 我们可以这样做: template< typename... args> struct dd; // edited according to answer but now getting error redeclared with 2 template parameters which is point below with mark %% template<> struct dd<>{ static const int value = 0; }; template<typename T,typename... args> //%% struct dd{ static const int value= 1+ dd<args...>::value; }; 但这不起作用,但为什么呢? 任何帮助非常感谢:) 编辑:根据答案编辑解决方案. 解决方法
使用模板< typename T,typename ... Args>你不能创建省略T的专业化(即dd<>) – 包可以是空的,但T不能.因此,您将模板声明为仅包含一个包的模板,专门用于空包以停止递归,并且部分专用于< T,Args ...>解压缩一种类型并创建一个包含(n – 1)类型的新包.
对于编辑:您不能定义具有不同参数但名称相同的另一个模板,您必须专门化现有的模板. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |