相关疑难解决方法(0)

输入trait以获取默认参数促销

[免责声明:我知道这个问题的答案.我认为这可能有一些普遍的兴趣.]

问题:我们怎样才能有一个类型特征产生由执行默认参数促销产生的类型?

动机:我希望能够可移植地使用变量参数.例如:

void foo(char const * fmt, ...);  // Please pass: * unsigned short
                                  //              * bool
                                  //              * char32_t
                                  //              * unsigned char
Run Code Online (Sandbox Code Playgroud)

当将参数传递给没有参数的函数调用时,即匹配省略号时,参数会进行默认参数提升.到目前为止一直很好,但这些促销是依赖于平台的.我可以恢复参数va_arg(ap, T),但是什么T

现在,对于一些简单的情况,这很容易:例如,我总是可以说:

unsigned short n = va_args(ap, unsigned int);
Run Code Online (Sandbox Code Playgroud)

默认促销将导致a signed int或an unsigned int,但根据,例如,C11 7.16.1.1/3,va-casting unsigned int总是很好,因为即使默认促销结果为a int,原始值也可以由两者表示类型.

但是当我期待一个类型时,我应该选择什么类型char32_t?C++ 11 4.5/2使得结果类型大开.所以我想要一个让我写的特质:

char32_t c = va_args(ap, default_promote<char32_t>::type);
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

当参数类型不能作为变量参数传递时,产生静态断言的特征的加值点.

c++ variadic-functions type-traits

8
推荐指数
1
解决办法
586
查看次数

标签 统计

c++ ×1

type-traits ×1

variadic-functions ×1