ネストされたテンプレートはC ++でどのように解決されますか?

tjwrona1992

最近、イテレータがコンパイル時に複雑な値を指しているかどうかを判断する方法について質問し、機能する回答を受け取りました。

質問はここにあります:複雑な値を指すイテレータのアルゴリズムをどのように特殊化できますか?

そして、解決策は、あるテンプレートが別のテンプレートの特殊化であるかどうかを判断する一連のテンプレートでした。

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

これは機能しますが、これがどのように機能するかを理解するのに本当に苦労しています。特に、templatea内にネストされているtemplateと、混乱します。また、可変個引数テンプレートの使用はまだかなり新しいので、たとえば、<class...>このようなものの代わりに、型が指定されていない可変個引数テンプレートを使用するのは奇妙に思え<class... Args>ます。

誰かがこのテンプレートを分解して、それがどのように解決されるかを説明できますか?

max66

テンプレートパラメータには次の3つのタイプがあることを考慮に入れる必要があります。

1)タイプ

2)非タイプ(または値)

3)テンプレート-テンプレート

最初のタイプの前にはtypename(またはclass)が付きます

template <typename T>
void foo (T const & t);

前の例でTは、は型であり、t(古典的な関数の引数)は型の値ですT

テンプレートパラメータの2番目のタイプは値であり、値のタイプが前に付きます(またはauto、指定されていないタイプの場合は、C ++ 17以降)。

template <int I>
void bar ()
 { std::cout << I << std::endl; }

前の例では、Iテンプレートパラメータはタイプの値ですint

3番目のタイプは、説明するのが最も複雑です。

std::vector<int>std::vector<double>は異なるタイプであることを知っていますか(私は推測します)が、共通してstd::vector、テンプレートクラスがあります。

template-templateパラメーターは、std::vector引数なしのテンプレートクラスを受け入れるパラメーターです

template次の例のように、template-templateパラメーターの前にキーワードがあります

template <template <int> class C>
void baz ();

C前の例のtemplate-templateパラメーターは、単一のint(値)テンプレートパラメーターを必要とするクラス(または構造体)です

だからあなたがクラスを持っているなら

template <int I>
class getInt
 { };

getIntテンプレートパラメータとして、に渡すことができますbaz()

baz<getInt>();

これで、コードを理解できるはずです。

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

is_specialization構造体は、テンプレートパラメータ、タイプ(として、受信テンプレート構造体であるT)、およびテンプレートテンプレートTemplate型テンプレートパラメータの可変長番号を受信するクラス/構造体を受け入れます。

今、あなたは以下の専門分野を持っていますis_specialization

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

この特殊化は、最初のテンプレートパラメータ(Template<Args...>)が2番目の(Template)に基づくクラスである場合に選択されます

例:インスタンス化する場合

is_specialization<std::vector<int>, std::map>

基づいていないstd::false_typeため、メインバージョン(から継承)が選択さstd::vector<int>れていstd::mapます。

しかし、インスタンス化する場合

is_specialization<std::vector<int>, std::vector>

基づいているstd::true_typeため、(から継承する特殊化が選択さstd::vector<int>std::vectorます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされたAngular2非同期パイプはどのように解決されますか?

分類Dev

テンプレート引数はどのように解決/推定されますか?

分類Dev

テンプレート化されたクラスは、そのタイプの1つで呼び出されたオーバーロードされた非メンバー関数をどのように解決しますか?

分類Dev

テンプレートクラスは、ネストされたテンプレートクラスからどのように継承できますか

分類Dev

PowerShellの$ profileはどのように解決されますか?

分類Dev

そのJavaScriptはどのように解決されますか?

分類Dev

連鎖マクロはCでどのように解決されますか?

分類Dev

ネストされたチェックポイントはsnakemakeでどのように解決されますか?

分類Dev

「posix」という名前はimportステートメントによってどこでどのように解決されますか?

分類Dev

NodeJSは解決されたPromiseをどのように通知されますか?

分類Dev

プリズマネクサスでカスタムネストされたextendTypeリゾルバーをどのように解決しますか?

分類Dev

このようなネストされたジェネリックメソッドはどのように解決できますか?

分類Dev

C ++テンプレートの関数解決はどのように行われますか?

分類Dev

Go Webアプリケーションのルートはどのように解決されますか?

分類Dev

Mavenリポジトリはどのように解決されますか?

分類Dev

テンプレート署名がvoid(void)に解決され、gccによって拒否されました。これは有効なC ++ですか?

分類Dev

c ++でネストされたテンプレートを使用するにはどうすればよいですか?

分類Dev

テンプレートパラメータとしてのシグネチャによってオーバーロードされた関数を解決するにはどうすればよいですか?

分類Dev

ネストされたテンプレートは可能か?

分類Dev

Angular 2で動的に追加されたコンポーネントの値を解決するにはどうすればよいですか?

分類Dev

Gradleで解決された依存関係のバージョン番号をどのように削除しますか?

分類Dev

ラムダは.NETフレームワークでどのように解決されますか?

分類Dev

ネストされたリストを別のネストされたリストに基づいてソートしようとしたときに発生するこのエラーを解決するにはどうすればよいですか?

分類Dev

これらのネストされたifステートメントをよりエレガントに書くにはどうすればよいですか?

分類Dev

これらのネストされたifステートメントをよりエレガントに書くにはどうすればよいですか?

分類Dev

CKeditor、HTMLは正しいのにテキストの色が保持されていないようですが、どうすれば解決できますか?

分類Dev

関数テンプレートは、initializer_listがネストされた回数をどのように推測できますか?

分類Dev

ネストされたC ++テンプレート

分類Dev

ネストされたテンプレートクラスの推論ガイドを提供するにはどうすればよいですか?

Related 関連記事

  1. 1

    ネストされたAngular2非同期パイプはどのように解決されますか?

  2. 2

    テンプレート引数はどのように解決/推定されますか?

  3. 3

    テンプレート化されたクラスは、そのタイプの1つで呼び出されたオーバーロードされた非メンバー関数をどのように解決しますか?

  4. 4

    テンプレートクラスは、ネストされたテンプレートクラスからどのように継承できますか

  5. 5

    PowerShellの$ profileはどのように解決されますか?

  6. 6

    そのJavaScriptはどのように解決されますか?

  7. 7

    連鎖マクロはCでどのように解決されますか?

  8. 8

    ネストされたチェックポイントはsnakemakeでどのように解決されますか?

  9. 9

    「posix」という名前はimportステートメントによってどこでどのように解決されますか?

  10. 10

    NodeJSは解決されたPromiseをどのように通知されますか?

  11. 11

    プリズマネクサスでカスタムネストされたextendTypeリゾルバーをどのように解決しますか?

  12. 12

    このようなネストされたジェネリックメソッドはどのように解決できますか?

  13. 13

    C ++テンプレートの関数解決はどのように行われますか?

  14. 14

    Go Webアプリケーションのルートはどのように解決されますか?

  15. 15

    Mavenリポジトリはどのように解決されますか?

  16. 16

    テンプレート署名がvoid(void)に解決され、gccによって拒否されました。これは有効なC ++ですか?

  17. 17

    c ++でネストされたテンプレートを使用するにはどうすればよいですか?

  18. 18

    テンプレートパラメータとしてのシグネチャによってオーバーロードされた関数を解決するにはどうすればよいですか?

  19. 19

    ネストされたテンプレートは可能か?

  20. 20

    Angular 2で動的に追加されたコンポーネントの値を解決するにはどうすればよいですか?

  21. 21

    Gradleで解決された依存関係のバージョン番号をどのように削除しますか?

  22. 22

    ラムダは.NETフレームワークでどのように解決されますか?

  23. 23

    ネストされたリストを別のネストされたリストに基づいてソートしようとしたときに発生するこのエラーを解決するにはどうすればよいですか?

  24. 24

    これらのネストされたifステートメントをよりエレガントに書くにはどうすればよいですか?

  25. 25

    これらのネストされたifステートメントをよりエレガントに書くにはどうすればよいですか?

  26. 26

    CKeditor、HTMLは正しいのにテキストの色が保持されていないようですが、どうすれば解決できますか?

  27. 27

    関数テンプレートは、initializer_listがネストされた回数をどのように推測できますか?

  28. 28

    ネストされたC ++テンプレート

  29. 29

    ネストされたテンプレートクラスの推論ガイドを提供するにはどうすればよいですか?

ホットタグ

アーカイブ