您好,我在Cppreference.com上看到了许多这样的示例:
std::is_class<T>
std::is_integral
以此类推。我知道我是否运行代码,例如得到true
或false
。但是,这有什么意义呢?例如知道对象是否属于类类型?
#include <iostream>
#include <type_traits>
struct A {};
class B {};
enum class C {};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_class<A>::value << '\n';
std::cout << std::is_class<B>::value << '\n';
std::cout << std::is_class<C>::value << '\n';
std::cout << std::is_class<int>::value << '\n';
}
输出:
true
true
false
false
我已经使用{is_class
,is_integral
,is_arithmetic
,...)搜索了一个真实的示例,但是所有教程都仅显示了无望的示例:仅true
或false
。
有人可以使用此模板为我提供一个有用的小例子吗?
答案 0 :(得分:17)
这肯定不是为了写入控制台。
更广泛地说,您在问:类型特征的意义是什么?
答案是模板元编程。例如,我可以创建一个模板专门化,它对整数类型做一件事,对非整数类型做另一件事。
亚伦·布尔曼(Aaron Bullman)拥有a simple introduction to type traits,雅克(Jacek)here也有。
我认为,大多数的使用会被埋藏在出色功能,类和实用程序的实现中(例如,在库中),作为使它们全部起作用的后台机制的一部分。 / p>
进一步阅读:
第一个问题的正确答案给出了一个特质何时有用的绝佳例子:
例如,当迭代器是指向POD的指针时,
std::copy
的实现可以在内部使用std::memcpy
而不是显式循环。这可以通过SFINAE来实现。
答案 1 :(得分:7)
用于模板元编程。当您不知道哪种类型时,最终用户将传递到模板中。有时是报告错误,有时是专门研究传递的类型。有时是一种组合。
在cppreference.com上看到的示例(例如https://en.cppreference.com/w/cpp/types/is_enum)过于简化,仅显示了如何以非典型方式使用该特征。您几乎永远不会直接在简单的(非模板函数或类)中直接使用这些特征。