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


14

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

std::is_class<T>
std::is_integral

等等。我知道我是否例如运行代码get 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

  • 有人能帮我举一个使用此模板的有用示例吗?


1
一个简单的例子- std::copy。如果要输入的类型std::copy是“简单”(如int或的数组)char怎么办?你会用memcpy吧?因此,您怎么说“如果类型简单,请使用memcpy,否则请使用“慢”循环”?
PaulMcKenzie

Answers:


17

这不是为了写入控制台,这是肯定的。

更广泛地说,您在问:类型特征的重点是什么?

答案是模板元编程。例如,我可以创建一个模板专门化,对整数类型做一件事,对非整数类型做另一件事。

亚伦Bullman有一个简单的介绍类型特点,象亚采这里

在我看来,这些东西的大部分使用都被埋藏在很酷的功能,类和实用程序的实现中(例如,在库中),作为使它们全部起作用的后台机制的一部分。

进一步阅读:

rightfold在第一个答案上给出了一个很好的例子,说明特质何时有用:

例如,当迭代器是指向POD的指针时,的实现std::copy可以在std::memcpy内部使用而不是显式循环。这可以通过SFINAE实现。


因此,您的意思是,例如,我可以使用它们来禁用某些特定类型模板的实例,例如,Power<T>当参数类型不是整数时,禁用模板化函数或类是合乎逻辑的,比如说std :: string?
拉米日元

1
@RamiYen,是的,这被称为SFINAE
克里斯,

7

它用于模板元编程。当您不知道哪种类型时,最终用户将传递到模板中。有时是报告错误,有时是专门研究传递的类型。有时是一种组合。

在cppreference.com上看到的示例(例如https://en.cppreference.com/w/cpp/types/is_enum)在很大程度上已简化,仅显示了如何以非典型方式使用该特征。您几乎永远不会直接在简单的(非模板函数或类)中直接使用这些特征。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.