解压可变参数模板的结果 - Visual Studio 2019 CE

Posted

技术标签:

【中文标题】解压可变参数模板的结果 - Visual Studio 2019 CE【英文标题】:Result of unpacking variadic template - Visual studio 2019 CE 【发布时间】:2020-08-30 09:42:49 【问题描述】:

出于调试目的,我想查看在 c++ 中解压缩可变参数模板的结果。在VS中无论如何都可能吗?

//variadic template
template<class ... Ts>
void foo(Ts...args)

//...some code 
auto x = bar(args..);

    
//client code:
foo(std::string("123"),int(4),5.6f);

我认为代码生成的结果会被解压成这样的:

void foo<std::string, int, float>(std::string args1, int args2, float args3)

//...some code 
auto x = bar(args1,args2,args3);

但如果它更难一点,谁知道它会解压成什么? :) 在尝试找到它之前,我认为如果在 VS 中将“属性->C/C++->预处理器->预处理到文件”切换为“是”,它将在预处理期间生成,我们可以看到这一点。但不是,在这个阶段它只适用于标题,#incldude's #define's ... 问题是如何查看解包参数包代码生成的结果?这段代码是否以可读的形式存在?或者结果翻译成二进制和*.exe文件?

【问题讨论】:

不确定VS能不能做到这一点,但你们cppinsights可以:cppinsights.io/s/00cd7215 是的!这正是我所需要的。我无法想象 VS 中缺少这个“必须具备的功能”。 【参考方案1】:

你可以做的是一种静态印刷。

静态打印将停止编译并显示参数的错误

template <typename...> 
struct TParamViewer;

#define DEBUG_PRINT

#ifdef DEBUG_PRINT
#define VIEW_TPL_PARAMS(index, params) TParamViewer<params> td##index;
#else
#define VIEW_TPL_PARAMS(index, params)
#endif

//variadic template
template<class ... Ts>
void foo(Ts...args)

    VIEW_TPL_PARAMS(0, Ts...);

静态打印会显示警告并显示参数

在这里,我们向查看器类添加一个定义,该类将显示一个警告,显示模板参数。

template <typename...> 
struct TParamViewer 
    bool i = 10;
;

所有这些解决方案都是把戏。在 gcc 中,有一个 proposed patch 用于正确的调试打印。

问候,

【讨论】:

这揭示了模板函数中写入的参数以打开(实际上它已经知道传递了哪些类型)。但它不显示打开模板的结果。

以上是关于解压可变参数模板的结果 - Visual Studio 2019 CE的主要内容,如果未能解决你的问题,请参考以下文章

MSVC2015 更新 3 可变参数模板解决方法

第21课 可变参数模板_展开参数包

模板参数迭代

第23课 可变参数模板_Optional和Lazy类的实现

[C++11 模板的改进] --- 可变参数模板

为啥可变参数模板的模板特化与非可变模板的特化不同?