問題タブ [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++ - 特定の場所での C++ テンプレート エイリアス (使用)
using
次のような状況では、(または他の方法で)型エイリアスを使用する必要があります。
私が書いたところにはHERE
、構造内で定義された長い型と複数の型があり、書く代わりにtypename <very long templated struct dependent on T>::type
ショートカットを書きたいと思います。
そして、テンプレートの特殊化や接尾辞の戻り値の構文など、より多くの状況でこれに遭遇しました。それで、最初の行と構造体/クラスまたは関数のusing
間の場所で(しゃれた意図なしで)使用する方法はありますか?.template <...>
,
(カンマ) のようなものを使用してみましたが(using X = ... , /*actually using X*/)
、成功しませんでした。
機能したのはグローバルスコープでしたusing
しかし、グローバル スコープは必要ありません。使用するテンプレートだけにスコープを適用したいのです。そして、私は書きたくありませDT<Iterator>
んDT
。
言うまでもなく、マクロやプリプロセッサ ディレクティブは問題外です。
実際の例:
typename DereferenceType<Iterator>::type&
ここで、次のようなショートカットが必要です。
ありがとうございました。
c++ - Visual Studio 2013 テンプレート エイリアス
次のコード
MSVC 2013 でエラーを生成します。
エラー C3203: 'enable_if_integral_t': 特殊化されていないエイリアス テンプレートは、テンプレート パラメーター 'Enable' のテンプレート引数として使用できません。実数型が必要です
しかし、gcc では問題なくコンパイルされます。
このコードは C++11 標準に準拠しており、Visual Studio のバグ/実装されていない機能ですか、それとも標準には準拠していませんが、gcc 拡張機能です。
VSでこれを機能させる方法はありますか?
ありがとうございました。
c++ - テンプレート エイリアスをテンプレート テンプレート パラメータとして一致させる
私は現在、boost::mpl::apply のような式を評価するためのメタ関数を書いています。
ご覧のとおりtypename ::result
、エバリュエーターを使用する際の書き込みを避けるために、C++11 テンプレート エイリアスを使用しています。
他の特殊化の中でも、eval_impl
(評価メタ関数の実装) には、ユーザーがパラメーター化された式 (メタ関数など) とパラメーターのセットを渡す場合の特殊化があります。つまり、eval
指定されたパラメーターのセットでメタ関数を評価するための高次メタ関数として使用します。
その場合、私は次のように専門化を書きました。
ここでユースケースを考えてみましょう:
ここでは、カスタム メタ関数をテンプレート エイリアスとして定義し、 呼び出し (評価) に使用する一連のパラメーターと共にfirst_of
に渡します。、... は単なるプレースホルダーです。eval
_1
_2
上記で定義された特殊化のインスタンスを呼び出すことを期待してeval
いましたが、そうではありません。また、エイリアス化された型が型自体ではなく、1 つのパラメーターのテンプレートである場合、GCC 4.8.1 は次のように述べています。
エラー: 1 つのテンプレート パラメーターが必要ですが、2 つ指定されました
そのeval_impl
専門化のインスタンス化の時点で。
エラーにより、テンプレート エイリアスが部分特殊化のテンプレート テンプレート パラメータに取り込まれず、代わりにエイリアス化された型が一致すると考えられます。
例でわかるように、それは私が望まないことではありません。テンプレート エイリアスを他のメタ関数と一致させる必要があります。それを達成する方法はありますか?
c++ - C++: クラスで std::enable_if をカプセル化しようとしています
std::enable_if
このような構造体にカプセル化する素晴らしいアイデアを思いついたとき、関数テンプレートを選択するために SFINAE を使用していました。
そして、たとえば、このように使用します
ただし、呼び出しでわかるように、これは機能しません
一方、作成しようとすることによって、
コンパイラ エラーが発生します (「型は std::enable_if のメンバーではありません」)。
この動作の理由は何ですか? 私の小さな SFINAE の知識から、型推定のエラーがオーバーロードの除外につながると考えていたので、私は尋ねています...?
完全を期すために、上記の問題はテンプレートのエイリアシングを使用して解決できます
テンプレートエイリアスの代わりに構造体を使用する代替手段はありますか?
編集:ここでは、一般的な問題を解決する実装を意味します。例えば、こちら
部分的な特殊化には単純な識別子が必要なため、うまくいきません。もしそうなら、std::is_same
一般的な構造体に置き換えることができCondition<T,U>
ます。代替案はありますか?