c++ - std::common_type 的目的是什么?

标签 c++ c++11

我开始查看 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/

相关文章:

r - 函数参数默认值 std :vector initialization with Rcpp and C++11?

c++ - 将 mtrace 用于 c++

c++ - 为什么在使用重载的 insertopm (<<) 运算符时会收到 SIGSEGV?

C++ *this 的值类别是什么?

c++ - 如何使用 C 或 C++ 查找给定的 IPv6 地址是否在 CIDR 范围内?

c++ - 为什么删除移动构造函数后我的对象没有被复制?

c++ - DirectX:动态顶点声明

c++ - Protocol Buffer 的 ASCII 安全序列化

c++ - Boost.预处理器 : BOOST_PP_TUPLE_ELEM and BOOST_PP_SEQ_ELEM

android - 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符