我开始查看 std::common_type
并且不确定它的用途和功能。
有几件事让我觉得很奇怪:
- 参数的顺序很重要:
common_type<Foo, Bar, Baz>
可能与common_type<Baz, Foo, Bar>
不同.一个可能编译,另一个可能不编译。虽然从common_type
的方式可以清楚地看到这一点被定义了,感觉很奇怪,不直观。这是因为缺乏通用解决方案还是有意为之? - 实例化可能会导致编译器错误,而不是我可以处理的错误。如何检查
common_type
真的会编译吗?is_convertible
还不够common_type
可能是专业的? 在这样的情况下仍然没有办法找出常见的类型:
struct Baz; struct Bar { int m; }; struct Foo { int m; }; struct Baz { Baz(const Bar&); Baz(const Foo&); };
推荐的解决方案是专门化
common_type
这很乏味。有没有更好的解决方案?
有关引用,请参阅 N3242 中的 §20.9.7.6 表 57。
最佳答案
std::common_type
被引入用于 std::duration
--- 如果您添加 std::duration<int>
和 std::duration<short>
那么结果应该是 std::duration<int>
.决定委托(delegate)一个单独的模板,该模板使用适用于 ?:
的核心语言规则找到结果,而不是指定无穷无尽的允许配对流。算术 if 运算符。
然后人们看到这个模板可能普遍有用,并将其添加为std::common_type
, 并扩展为处理任意数量的类型。但在 C++0x 库中,它仅用于类型对。
您应该能够使用新的 SFINAE 规则来检测是否有 std::common_type
的某些实例化。已验证。不过我没试过。在大多数情况下,如果没有“通用类型”,那么无论如何您都无法做任何有意义的事情,因此编译错误是合理的。
std::common_type
不是魔法 --- 它遵循 ?:
的规则.如果 true?a:b
将编译,std::common_type<decltype(a),decltype(b)>::type
会给你结果的类型。
关于c++ - std::common_type 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6503773/