[免责声明:我知道这个问题的答案。我认为这可能会引起一些普遍的兴趣。]
问题:我们怎样才能拥有一种类型特征,能够产生由执行而产生的类型默认参数促销?
动机:我希望能够可移植地使用变量参数。例如:
void foo(char const * fmt, ...); // Please pass: * unsigned short
// * bool
// * char32_t
// * unsigned char
当将参数传递给不带参数的函数调用时,即匹配省略号,参数将经历默认参数提升。到目前为止一切顺利,但这些促销活动取决于平台。我可以用以下方法恢复参数va_arg(ap, T)
,但是什么是T
?
现在,对于一些简单的情况这很容易:例如,我总是可以说:
unsigned short n = va_args(ap, unsigned int);
默认促销将导致signed int
or an unsigned int
,但是根据 C11 7.16.1.1/3,va-casting 到unsigned int
总是好的,因为即使默认促销会导致int
,原始值可以用两种类型表示。
但是当我期望时我应该转换为什么类型char32_t
? C++11 4.5/2 保留了结果类型的开放性。所以我想要一个让我可以写的特征:
char32_t c = va_args(ap, default_promote<char32_t>::type);
这个怎么做?
当参数类型不得作为变量参数传递时,会产生静态断言的特征的奖励点。