了解对象是否为整数或类类型有什么意义?

时间:2019-11-06 17:55:58

标签: c++ templates

您好,我在Cppreference.com上看到了许多这样的示例:

std::is_class<T>
std::is_integral

以此类推。我知道我是否运行代码,例如得到truefalse。但是,这有什么意义呢?例如知道对象是否属于类类型?

#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_classis_integralis_arithmetic,...)搜索了一个真实的示例,但是所有教程都仅显示了无望的示例:仅truefalse

  • 有人可以使用此模板为我提供一个有用的小例子吗?

2 个答案:

答案 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)过于简化,仅显示了如何以非典型方式使用该特征。您几乎永远不会直接在简单的(非模板函数或类)中直接使用这些特征。