【发布时间】:2013-11-21 10:51:55
【问题描述】:
我需要知道什么时候进行促销,以及促销活动是什么。我的猜测是
template <typename T>
struct promoted { using type = std::common_type_t<T, T>; };
template <typename T>
using promoted_t = typename promoted<T>::type;
显然,如果用户开始覆盖 std::common_type 的版本,这将中断。假设这不会发生,它会起作用吗?条件运算符应该在进一步评估之前应用促销。我确实认为有一天这样的东西应该出现在标准中。
如果你想知道我为什么要这个,它是针对 C 级可变参数的:
auto r = va_arg( the_va_list, T );
如果我最初传入的类型在 varargs 中使用时会被转换,例如 floats 变成 doubles,我是输入 T 的原始类型还是错位类型?如果是后者,我正在为此创建一个特征类型,这需要在最后一步中使用提升特征。
【问题讨论】:
-
我刚刚意识到我可以手动使用
decltype( declval<bool>() ? declval<T>() : declval<T>() ),而不是希望common_type不会被覆盖。 (如果至少一种类型是用户定义的,您可以覆盖common_type。枚举类型是用户定义的,有时会受到促销的影响。) -
“条件运算符应该在进一步评估之前应用提升”——不,不是。这在 C++ 中甚至是不可能的,因为条件运算符的结果可以是左值。
标签: c++ c++11 type-promotion