オブジェクトが整数であるかどうか、またはクラス型であるかどうかを知る上でのポイントは何ですか?


14

こんにちは私は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_classis_integralis_arithmetic、...)しかし、すべてのチュートリアルは絶望的な例を示しますだけtruefalse

  • 誰かがこのテンプレートを使用した小さな便利な例を教えてくれませんか?


1
簡単な例- std::copy。またはのstd::copy配列のように、型が「単純」である場合はどうなりますintchar?使用しmemcpyますよね?それでは、「型が単純な場合はmemcpyを使用し、それ以外の場合は「低速」ループを使用する」とどのように言いますか?
PaulMcKenzie

回答:


17

確かに、コンソールへの書き込み用ではありません。

より広くあなたが求めているのは、タイプ特性のポイントは何ですか?

答えはテンプレートのメタプログラミングです。たとえば、整数型に対して1つの処理を行い、非整数型に対して別の処理を行うテンプレート特殊化を作成できます。

アーロン・ブルマンはここでヤチェクがそうであるように、タイプ特性の簡単な紹介をしています

私の意見では、これらのもののほとんどの使用は、すべてを機能させるバックグラウンドメカニズムの一部として、クールな機能とクラスおよびユーティリティの実装(つまり、ライブラリ)に埋め込まれています。

参考文献:

その最初の1つに関するrightfoldの答えは、特性が役立つときの素晴らしい例を示します:

たとえば、の実装でstd::copystd::memcpy、イテレータがPODへのポインタである場合、明示的なループの代わりに内部的に使用される場合があります。これはSFINAEで実現できます。


つまり、たとえば、それらを使用して特定のタイプのテンプレートの一部のインスタンスを無効にできることを意味します。たとえばPower<T>、引数のタイプが整数でない場合に、テンプレート関数またはクラスを無効にするのは論理的です。たとえば、std :: string?
Rami Yen、

1
@RamiYen、はい、それはSFINAEと呼ばれます
クリス

7

テンプレートメタプログラミング用です。エンドユーザーがテンプレートに渡すタイプがわからない場合。エラーを報告することもあれば、渡されたタイプに特化することもあります。時にはそれは組み合わせです。

cppreference.com(例:https ://en.cppreference.com/w/cpp/types/is_enum)で見られる例は、非常に単純化されており、一般的ではない方法で特性を使用する方法を示しています。これらの特性を単純な(非テンプレート関数またはクラス)で直接使用することはほとんどありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.