C++14及以下可变参数模板空包调用问题求助
解决方案
针对C++14及以下版本,要实现支持0个或多个模板参数的external_function级联调用,核心是让空参数包的调用能匹配到正确的终止逻辑,同时避免非空场景的歧义。
可行代码实现
#include <type_traits> template <typename TA, typename... TB> class A { public: inline long long f() { return g<TB...>(6); // 6为占位符,实际替换为类成员值 } private: // 终止版本:匹配空参数包 template <typename... Tail> inline typename std::enable_if<sizeof...(Tail) == 0, long long>::type g(long long x) { return x; } // 递归版本:匹配至少一个参数的情况 template <typename Head, typename... Tail> inline long long g(long long x) { return (&Head::instance())->external_function(g<Tail...>(x)); } };
问题原因分析
- 原代码问题:当
TB为空时,调用g<>()会寻找模板版本的g,但原代码的模板g都要求至少一个模板参数,而非模板的g(long long)无法匹配模板调用语法g<>(),导致编译错误。 - 尝试的重载问题:
- 第一种重载中,单参数模板
template<typename Head> g和多参数模板template<typename Head, typename... Tail> g在调用单参数场景时会产生歧义,编译器无法判断哪个更优先。 - 第二种重载中,
template<typename Head, typename... Tail> g和template<typename... Tail> g在单参数场景下都会匹配(前者Tail为空,后者Tail包含单个参数),同样引发歧义。
- 第一种重载中,单参数模板
方案原理
- 利用
std::enable_if和sizeof...(Tail)判断参数包是否为空,确保空参数包只能匹配终止版本。 - 递归版本仅在参数包非空时匹配,且因为模板参数更具体(明确包含
Head),编译器会优先选择它,不会产生歧义。
内容的提问来源于stack exchange,提问作者Codexy
相关产品推荐
相关产品推荐

