問題タブ [template-argument-deduction]

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.

0 投票する
7 に答える
2893 参照

c++ - 型のないテンプレート パラメーターを推測する

テンプレート関数のパラメーターから非型のテンプレート パラメーターを推測することは可能ですか?

次の単純なテンプレートを検討してください。

factorial代わりに次のように呼び出すことができるように変更できるようにしたいと思います。

コンパイル時にコンパイラに N の値を計算させます。これは可能ですか?たぶん、派手なC++ 11の追加でしょうか?

0 投票する
2 に答える
461 参照

c++ - 3 つ以上の引数を持つ std::function の推定

なぜstd::functionは 2 引数の関数しか認識しないのだろうか。うまく機能するコードをいくつか書きましたが、いくつかの制限があります。どんなフィードバックでも大歓迎です。特に、車輪の再発明をしているのではないかと思います。

私のコードはideoneにあり、参照します。

たとえば、次のように型を記述できますmain

(ここで、'i' は 'int' を意味し、'PPc' はポインタからポインタへの文字を意味します)

Standardstd::functionは 3 つ以上の引数を持つ関数では動作しませんが (私のコードの最後の 2 行を参照)、このコードでは動作します (サンプル コードは 3 つの引数の関数を示しています)。代わりに、私のデザインを標準ライブラリで使用する必要があります! typedef tuple<Args...> args_as_tuple;最初の 2 つの引数タイプだけでなく、すべての引数を格納するように定義します。

主なトリックは、この関数の演繹です。

制限:

  • ラムダでは機能しません。これはコンパイルされませんfunction_type_deducer([](){}).describe_me();
  • xyの間に小さな違いがあることにy気づきませstring&ん。(std::function もこれに気づきません)xstring

これらのいずれかを修正する方法についてのアイデアはありますか? 私は車輪を再発明しましたか?

0 投票する
3 に答える
5023 参照

c++ - テンプレート引数控除

私は現在、自分では解決できない問題に直面しています。基本的に私がやろうとしているのは、C++ で linq のような動作を実装することです。

ヘッダーのコードから始めます。

そして、これは私がそれをインスタンス化する方法です:

言うまでもなく、これは機能しません(そうでなければ、私はここにいません:))

さらに奇妙なのは、これでも機能しないように見えることです。

ご覧のとおり (選択関数を見てください)、次のようなものだけを使用しないことが重要です。

これを解決する方法について何か提案はありますか? そして、これは可能ですか?

どんな助けでも大歓迎です!

編集:私が得ているエラー:

編集2:

私が理解している限り、コンパイラーは、C が 2 つのクラス引数をとらず、1 つのクラス引数と 1 つのテンプレート化されたクラス引数 (1) をとらないことに不平を言っています。これは、C をそのように定義したためです。この問題を解決する方法はありますか?

0 投票する
4 に答える
20320 参照

c++ - 厳密に型指定された列挙によるテンプレート引数推定

通常の (弱い) 列挙がある場合、その列挙値を非型テンプレート パラメーターとして使用できます。次のようにします。

そしてそれを次のように呼び出します:magic<Cat>(t)

私が見る限り、厳密に型指定された列挙型があり、列挙型をハードコーディングしたくない場合は、次のようになります。

そして今、私は書く必要があります: magic<Animal, Animal::Cat>(t)、これは冗長に思えます。

列挙型クラスと値の両方を入力しないようにする方法はありますか?

0 投票する
1 に答える
576 参照

c++ - C++ ポインターからメソッドへのテンプレートの推定は、x86 をターゲットにしている場合はコンパイルされませんが、x64 では機能します。

私はこのサンプルコードを持っています:

これは で問題なくコンパイルされg++ます。VC10 でも問題なくコンパイルできますが、64 ビット プラットフォーム用にビルドする場合のみです。32 ビット プラットフォーム用にビルドすると、次のコンパイル エラーが発生します。

このエラーは、特殊化されていないバージョンの Gobstopper が使用されていることを示してSignatureint (void)ます。Signature しかし、エラーはそれが であることも明確に示していますint (void)。では、エラーはどこから来るのでしょうか? どうすれば修正できますか?

32 ビットから 64 ビットに変更され、エラー メッセージに表示される署名に表示されない可能性がある唯一のことは、呼び出し規約です。どうやら、VC x64 には統一された呼び出し規約がありますが、x86 ではそれぞれの呼び出し規約が異なります。しかし、それが問題だとしても、それを修正する方法がわかりません。

編集:通常の(非メンバー)関数ポインターでこれを試したところ、うまくいきました。

0 投票する
1 に答える
290 参照

c++ - 引数置換の C++ 規則

ブースト scoped_ptr を使用した C++ ポリモーフィズムに続いて、C++ 引数推定のルールを理解したいと思います。例えば:

  1. スマート ポインターとコンテナーが使用される場合の C++ ポリモーフィック置換の規則
  2. const 引数と非 const 引数の間の自動変換
  3. いつ一時変数を参照として渡すことができますか?
  4. テンプレートの引数の推定では、ルールはどのように異なりますか。

標準に関連するセクションがある場合は、それも役立ちます。

0 投票する
1 に答える
909 参照

c++ - メンバー関数とconstメンバー関数ポインターの控除

私は次のコードを持っています:

それはうまく機能しますが、constとnon-constのメンバー関数ポインターに2つの異なる関数を使用したくありません。したがって、問題は次のとおりです 。1つの関数にマージする方法はvoid foo(T&, const std::function<Ret()>&)ありますか?マージ後の解決にも関与する必要void foo(T&, Ret(T::*)() const)がある過負荷があることに注意してください。std::functionメンバー関数ポインターのみを受け取る関数が必要です。そして、他のすべてはstd::functionバージョンへの道を作ります。

0 投票する
2 に答える
672 参照

c++ - テンプレートパラメータの推定におけるinta[5]とint(&a)[5]の違い

この質問は、静的に既知のサイズの配列を受け取る関数に関するものです。

たとえば、次の最小限のプログラムを考えてみましょう。

これを実行すると、期待される結果が出力されます。

ただし、コンパイラ(VS 2010)にを推測させようとすると5、それが発生しcould not deduce template argument for 'int [n]' from 'int [5]'ます。

少し調べた結果arrfun_b、テンプレートパラメータの推定が機能する場所が更新されました。

プログラムの結果は、呼び出されても呼び出されても同じarrfun_aですarrfun_b

これまでのところ、私が見つけた唯一の違いは、テンプレート引数の推論が機能するかどうか、および5ではないNで関数を呼び出すことが可能かどうかです...

0 投票する
3 に答える
2655 参照

c++ - std::function 呼び出しシグネチャからテンプレート引数を推測する

このテンプレート関数を考えてみましょう:

ReturnT渡された呼び出しシグネチャからコンパイラが推測できないのはなぜですか?

0 投票する
3 に答える
2759 参照

c++ - デフォルトのテンプレート パラメータ: テンプレート引数を指定しないとコンパイラが文句を言うのはなぜですか?

私はこのコードを持っています:

同じテンプレート「署名」を使用foo()してテンプレート関数として作成すると、コンパイラはテンプレート引数を指定しないことについて文句を言いません。

では、なぜテンプレート クラスの引数を既定のパラメーターで指定する必要があるのに、テンプレート関数の引数を指定する必要がないのでしょうか。私が見逃している微妙な点はありますか?

その理由は、確かにテンプレートの引数推定の失敗によるものです。しかし、私はその理由を知りたいです。