[免责声明:我知道这个问题的答案.我认为这可能有一些普遍的兴趣.]
问题:我们怎样才能有一个类型特征产生由执行默认参数促销产生的类型?
动机:我希望能够可移植地使用变量参数.例如:
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)
这该怎么做?
当参数类型不能作为变量参数传递时,产生静态断言的特征的加值点.