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

问题描述

出于调试目的,我想查看在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的#define的标头... 问题是如何查看解压缩参数包代码生成的结果?此代码是否以可读形式存在?还是将结果转换为二进制和* .exe文件

解决方法

您可以做的是一种静态打印。

静态打印会停止编译,并显示错误信息

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用于正确的调试打印。

此致