c++ - std::common_type 实现

标签 c++ c++11 g++ typetraits

为了了解它是如何工作的,我查看了标题 type_traitsstd::common_type 的 libstdc++ 实现。我不得不承认我并不真正理解它是如何工作的。在这里:

/// common_type
template<typename... _Tp>
    struct common_type;

template<typename _Tp>
    struct common_type<_Tp>
    { typedef _Tp type; };

template<typename _Tp, typename _Up>
    struct common_type<_Tp, _Up>
    { typedef decltype(true ? declval<_Tp>() : declval<_Up>()) type; };

template<typename _Tp, typename _Up, typename... _Vp>
    struct common_type<_Tp, _Up, _Vp...>
    {
        typedef typename
        common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type;
    };

我很清楚第一个、第二个和第四个声明是如何工作的。但是,我无法理解第三个声明是如何工作的。有人可以尝试解释这里使用的机制吗?

最佳答案

首先,std::declval<T>()产生 T 类型的右值.尝试对该值做任何事情都会失败,因此它只能在未评估的上下文中使用。接下来,三元运算符将其类型推导为两个参数共有的最特殊类型(如果没有这种类型,则失败)。所以,表达式的类型

true? declval<T0>(): declval<T1>()

T0 最专业的常见类型和 T1 .剩下的就是将此表达式转换为类型并确保不对它求值。 decltype(expr)就是这样做的。显然,逻辑的两个参数版本:其他版本用于处理极端情况(一个参数)并利用两个参数版本产生任意类型的通用类型。

关于c++ - std::common_type 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12290046/

相关文章:

c++ - 如何找到纪元时间戳和 std::chrono::system_clock::now 之间以毫秒为单位的时差

c++ - 将字符串写入和读取二进制文件 C++

c++ - 放置指向 shared_ptr 的多重映射的指针不起作用

c++ - 将 std::vector 分配给方法内的指针

c++ - 在 ',' 错误之前预期为 '...' 或 'struct'

c++ - 使用 -MM 生成包含指令和依赖项

c++ - 堆栈链接错误问题

包含 header 的 C++ 错误

c++ - 从 popen 执行命令 shell 并设置其他命令 shell

安卓NDK |如何调试应用程序启动或暂停应用程序直到调试器连接