問題タブ [template-aliases]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++11 - エイリアス テンプレートを設定する SFINAE
SFINAE を使用して、特性クラスにエイリアスが存在するかどうかに応じて、別のクラスにエイリアス テンプレートを設定できるかどうか疑問に思っていました。
基本的に、2 つのクラス Foo1 と Foo2 と、この場合は単純化するために型エイリアスを定義するそれらの特性クラスがあります。すべての場合に type1 エイリアスがあり、場合によっては type2 があります。
別のクラス (私の場合、実際には Foo の基本クラス) で、これらの型のエイリアスを設定したいと考えています。
疑似コードで書かれているようなものを実際に達成するにはどうすればよいですか
c++ - テンプレート エイリアスを使用して不要なパラメータを 1 つ削除する方法
私はこのテンプレートクラスを持っています:
関数と関数によって返される値を保持するクラスが必要なため (関数への参照が必要なため)。
ご覧のとおり、2 つのテンプレート パラメーターがありますが、実際には最初のパラメーターは冗長です。何らかの方法で取り除くことは可能ですか?テンプレートエイリアス? マクロより優れたもの
c++ - C++ const 参照の形式は何ですか (const への参照ではなく、const 参照)
与えられた
Visual C++ と g++ の両方で、このコードはコメントに示されているようにコンパイルされfoo2
、コンパイル エラーが発生するだけです。
foo
コア言語の「失敗した実験」演算子表記法と同じ制約でその表記法を使用できるようにするために、同様にコンパイルエラーが発生することを望みました。
コンパイルするfoo
理由は、呼び出しがコンパイルされる理由と同じであるとconstref_call
思いますが、テンプレートに関するいくつかの例外がありますが、本当にそうでしょうか?ここでの標準の正式な規則は何ですか?
c++ - テンプレート テンプレート パラメータがクラス テンプレートまたはエイリアス テンプレートであるクラス テンプレートへの C++ 動的ダウンキャスト
タイトルが意味をなすことを願っています。正確に表現するための語彙が欠けているのでしょう。
まあ、例はおそらくより明確になるでしょう。
私の問題は次のとおりです。動的ダウンキャストは、次のケースのいくつかで実行時に0を返します(コメントに書かれています)。それが正しい動作 (C++11 を使用) であるかどうか、またその理由と、それを機能させるために何ができるかを知りたいです。明らかに、Templated と A::A_templated は、エイリアス "using" を使用して同一として定義されているにもかかわらず、異なるクラスとして扱われます。単純な typedef エイリアスでは問題は発生しません。
問題を確認する別の方法を提案します。これはおそらくより明確です。上記の例を回避しようとした後、私はそれに直面しています。次の例は、基本的に Bogdan が指摘したことを示しています。コンパイラが Templated_alias を使用して Templated を解決できないという事実は、非常にイライラさせられます。テンプレートエイリアスを介して強制的に型を解決できるコンパイルオプションが存在するかどうか疑問に思っています。
ボグダンのトリックのおかげで、少し鼻血が出た後、何とか解決策を見つけることができました. アイデアは、テンプレート クラスの潜在的なエイリアスの「フィルタリング」を担当するクラスを構築することです。「フィルタリング」する必要があるテンプレート クラスごとに 1 つの仕様が必要です。この方法の主な欠点は、一貫性を保つために、テンプレート クラスがテンプレート パラメータとして使用されるすべての場所でフィルタリングを使用する必要があることです。
出力は次のとおりです。
上記のトリックを使用した後。私はさまざまな問題に遭遇しました。絶対に関係があるとは断言できませんが、その可能性は非常に高いです。コンパイラは「動的テーブル」を正しく構築するのに苦労しているようです。type_info::hash_code を 2 つの (おそらく) 同じオブジェクトで異なるものにすることができる C++でこの問題を求めました 。
c++ - エイリアス テンプレートのパック拡張
pack 引数は、エイリアス テンプレートの pack パラメータの場所でのみ展開できるようです。これは、クラスまたは関数テンプレートには当てはまりません。
より単純なケース:
上記のコードは、とin 、とf
の両方で ( がインスタンス化されていなくても)エラーを生成します。c++11
c++14
g++ 4.9
g++ 5.1
clang 3.5
これが許可されない理由と一般的なルールは何ですか? これを制限する理由はありません。それは非常に奇妙な禁止のようです。
x_fix_t
最初のバリアントのように書かない理由についてx_t
は、必須の最初の引数があることがより明確です。(たとえば、それがf()
許可されていない理由です)。しかし、これはそれほど重要ではありません。修正は簡単です。疑問が残ります:なぜですか?
gcc エラー:
クランエラー:
c++ - 従属名としてのテンプレート エイリアス
別のテンプレート関数の依存テンプレート エイリアスに基づいてテンプレート関数を呼び出す方法は?
たとえば、テンプレート クラスと、このクラスをテンプレート引数として受け入れるテンプレート関数があります。
次に、 へのテンプレート エイリアスを含むクラスがありますFooClass
。
最後に、別のテンプレート関数があります。これはMyClass
テンプレート引数として受け取り、それを使用して適切な型でFooAlias
呼び出します。printFoo
テンプレート引数に依存しない目的のクラスまたはそのエイリアスを直接使用すると、すべて問題ありません。依存エイリアスを使用しようとするとすぐに、次のエラー メッセージが表示されます。
T::FooAlias
に渡す適切な方法は何printFoo()
ですか?
c++ - テンプレート エイリアスのスコープ
http://en.cppreference.com/w/cpp/language/type_aliasによると、エイリアスはブロックレベルの宣言です。テンプレート エイリアスについて特別なことは何も言っていないので、テンプレート エイリアスもブロックレベルの宣言であることを理解しておいてください。
ただし、ブロック レベルでテンプレート エイリアスを使用することはできません。エラーはコンパイラによって異なります。g++ では意味のあるメッセージが表示され、テンプレートはブロック スコープでは許可されていませんが、clang は完全に不可解です。(例: http://coliru.stacked-crooked.com/a/0f0862dad6f3da61 )。
これまでの質問:
- cppreference は、テンプレート エイリアスをブロック スコープで使用できないことを指定できませんか? (または、読書コースを受講する必要がありますか?)
- コンパイラは、ブロック レベルでテンプレート エイリアスを拒否する点で正しいですか (私の特定のコーディング習慣にとって非常に興味深い機能です)。
- 2 番目の答えが「はい」の場合、その理由は何でしょうか? コンパイラがこの純粋な構文糖衣を拒否するのはなぜですか?
c++ - CUDA の C++11 エイリアス テンプレート
重要な質問は、エイリアス テンプレートが CUDA コンパイラでサポートされているかどうかです。
gcc-4.8でUbuntuでCUDA 7.5を使用しています。すべてのテンプレート クラスはヘッダー ファイルで定義され、#include
コンパイル中に 1 つの翻訳単位に変換されます。
cuda_array
の周りに薄いラッパーを提供する単純なクラスがありますstd::vector
。thrust::host_vector
これは基本的に、 と を組み合わせた非常に単純なバージョンですthrust::device_vector
。その宣言は
マトリックスを作成するために、簡単なテンプレート エイリアスを作成しました。
operator*
型の安全性と使いやすさのために、行列とベクトルの乗算 CUDA カーネルをオーバーロードされたカーネルにマップしたいと考えています (正しく呼び出されることを確認するのは呼び出し元に任されています) push
。pull
私の「main.cpp」には、
最後の行は、というエラーをスローします
考えられるテンプレート型推定エラーの通常の容疑者をすべて追跡しましたが、何も機能しませんでした。必死になって、cuda_matrix
エイリアス テンプレートをテンプレート クラスに変換しました。
そしてコンパイルエラーが消える!したがって、CUDA はまだエイリアス テンプレートをサポートしていないようです。それとも、私が理解できないばかげたことをしましたか?