如何解决C++模板参数_t2无法推导的问题且不改动main函数?
C++模板参数
_t2推导失败解决方案 根因分析
- 模板参数声明不匹配:原代码将
_t2声明为模板模板参数,而std::tuple<int, _t2>的第二个参数位需要的是普通类型参数,语法层面首先不成立。 - 非推导语境限制:无显式类型的花括号初始化列表
{2, 'a'}属于C++标准定义的非推导语境,编译器无法直接通过该初始化列表推导std::tuple的具体类型。
解决方案(全程不修改main函数)
全版本兼容方案(支持C++11及以上)
仅需做两处极小改动:一是把错误的模板模板参数声明改为普通类型参数,二是新增一个变参重载处理花括号初始化列表的推导,原有业务逻辑完全不需要调整。
完整可运行代码如下:
#include <tuple> #include <utility> // 原函数仅修改_t2的声明即可,业务逻辑不变 template < typename _t1, typename _t2> void test( _t1 p1, std::tuple<int, _t2> p2) { // 原有业务代码写在这里 } // 新增变参重载,自动推导花括号内的元素并构造tuple template <typename _t1, typename ...Args> void test(_t1 p1, Args&&... args) { test(p1, std::make_tuple(std::forward<Args>(args)...)); } int main(int argc, char *argv[]) { test( 1, { 2, 'a' }); return 0; }
C++20极简方案
如果项目允许使用C++20标准,可以用参数auto简写,代码改动最小:
#include <tuple> template <typename _t1> void test(_t1 p1, std::tuple<int, auto> p2) { // 若需要使用原_t2类型,可通过decltype(std::get<1>(p2))获取 }
内容的提问来源于stack exchange,提问作者VeNToR
相关产品推荐
相关产品推荐

