为何可变参数Tuple无模板参数的基例无法正常工作?
问题原因
你定义的主模板template <typename Head, typename... Tail> struct Tuple强制要求至少有一个模板参数(Head是必选的),而显式特化Tuple<>是0个模板参数的情况,编译器无法将其匹配到主模板的特化上——因为主模板根本不支持0个参数的实例化,所以会认为你是在声明一个全新的、参数不足的模板,从而抛出错误。
修复方案
需要先定义一个支持0个或多个参数的主模板,再通过部分特化来实现带元素的Tuple版本,空版本作为显式特化:
// 主模板:接受任意数量(包括0个)的模板参数 template <typename... Args> struct Tuple; // 部分特化:处理至少有一个元素的情况 template <typename Head, typename... Tail> struct Tuple<Head, Tail...> : Tuple<Tail...> { Tuple(const Head& head, const Tail&... tail) : Base{tail...}, m_head{head} {} private: using Base = Tuple<Tail...>; Head m_head; }; // 显式特化:空Tuple的基例 template <> struct Tuple<> {};
调整后,主模板Tuple的参数列表是可变参数typename... Args,可以接受0个参数,Tuple<>作为它的显式特化就合法了;带元素的版本是主模板的部分特化,匹配有至少一个参数的情况,继承关系也能正常递归到空基例。
内容的提问来源于stack exchange,提问作者bobeff
相关产品推荐
相关产品推荐

