为什么使用结构实现type_traits

问题描述 投票:0回答:3

大多数类型特征是使用结构和模板的部分(或完整)专门化来制作的。例如,std::is_same实现为

template<typename>
struct is_same : false_type {};
template<typename T>
struct is_same<T, T> : true_type {}; // partial specialization

用法将是

bool are_equal = std::is_same<T, U>::value;

.. = std::is_same_v<T, U>;

两者都有点难看。起初我以为这是唯一的解决方案,然后我发现变量也可以是部分专用的(而函数不能)。类型转换特征不能(很明显)是变量,但是对于“信息”特征来说,为什么这并不比结构更好?

template<typename>
inline constexpr bool is_same = false;
template<typename T>
inline constexpr bool is_same<T, T> = true;

然后

bool are_equal = std::is_same<T, U>;
c++ typetraits
3个回答
1
投票

原因仅是历史原因。大多数类型特征都是在C ++ 11中首先添加到库中的。稍后在C ++ 14中添加了变量模板,并且更改实现的观点不可行,因为这太向后不兼容。因此添加了带有_v后缀的变量,这成为惯例。

以相同的方式添加新特性,因为在任何库中保持一致很重要,更不用说标准库了。


0
投票

有时,您需要一种类型,而不仅仅是基础bool值。标签分发技术提供了一个简单的示例:

void foo(std::true_type)  { ... }
void foo(std::false_type) { ... }

foo(std::is_same<T, S>{});

如果std::is_same只是一个bool变量模板,那么这段代码就不会那么优雅。


0
投票

请注意,类型和非类型参数不可互换。您不能编写同时接受两者的一元模板。如果要构建成熟的编译时计算代数,则需要选择一种参数类型并使所有模板都接受。

© www.soinside.com 2019 - 2024. All rights reserved.