問題タブ [enable-if]
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++0x の型推論が boost::enable_if を台無しにする
多次元配列 (任意のランク) の特定のサンプリング座標で線形補間を実行する汎用フィルタリング関数を作成しようとしています。このためには、値とそれに関連付けられた型に到達するまで、配列のすべての次元をたどる再帰関数テンプレートが必要です。ディメンションの反復処理を停止するタイミングを検出するために、boost::enable_if を使用します。戻り値/型を最上位の関数に「パーコレート」しようとするまで、問題なく動作します。この目的のために、C++0x の型推論を使用しようとしましたが、boost::enable_if とうまく組み合わせられないようです。
問題を次のように切り分けました。
コンパイラ (GCC 4.6) は、次のコードで不平を言います:
エラーメッセージ:
test< T, I - 1 > の戻り値を使用するように指示されているにもかかわらず、decltype は test< T, I > の戻り値を使用しているようです。この動作が発生する理由は何ですか? 今のところ、全体をファンクターに変えるだけだと思います...
c++ - C++ - タプルの繰り返しと型と定数パラメーターの解決
現在、タプルの算術演算子のオーバーロードを作成中です。オペレーターは、タプルを繰り返し処理して、個々の要素ごとに操作を実行します。演算子 += の定義は次のとおりです。
残念ながら、オペレーターを呼び出そうとすると、GCC 4.6 は使用するオーバーロードを決定できません。例えば:
次のエラーが発生します。
std::enable_if
条件が不適切な呼び出しを拒否する必要があるため、これは奇妙です。今のところ、実際に以前の実装であった次の回避策があります。上記のバージョンは、実際には簡略化の試みです。
これはコンパイルされ、期待どおりに動作します。簡易版がコンパイルを拒否するのはなぜですか? ありがとう。
c++ - メンバー関数で boost::enable_if を使用できますか?
テンプレート クラスを作成していて、特定のテンプレート タイプに対してのみ追加のメソッドが存在できるようにしたいと考えています。現在、このメソッドはすべてのテンプレート タイプに存在しますが、他のすべてのタイプではコンパイル エラーが発生します。
これを複雑にしているのは、それがオーバーロードされた operator() であることです。私がやりたいことが実際にここで可能かどうかはわかりません。
これが私が今持っているものです:
T&
バージョンを常に利用できるようにしたいのですが、T const&
バージョンが有効な場合にのみ利用できUtility2<BASE>
ます。現在、両方の方法が存在しますが、const バージョンを使用しようとすると、Utility2<BASE>
無効な場合に奇妙なコンパイル エラーが発生します。賢明なエラー、または「そのようなメンバー関数はありません」というエラーが発生することをお勧めします。
これは可能ですか?
編集:ブーストドキュメントを読んだ後、ここに私が思いついたものがありますが、うまくいくようです:
そのため、誰かが Utility2 で使用しようとしない限り、そのメソッドは存在せず、その BASE タイプに対して有効な場合にのみ Utility2 を作成できます。ただし、その BASE 型に対して有効でない場合、MyClass はアクセサー メソッドの作成に時間を浪費しません。
c++ - C++ - Behavior of function template specialization with rvalue reference
I'm trying to implement a conditional pointer dereferencing function. The basic idea is as follows:
#xA;In order to limit the number of necessary specialization, I'm attempting to use rvalue references for the case where arg
is not a pointer. Here is my current implementation (the std::cout
are there solely for debugging purpose):
Now, I get a rather strange behavior under GCC 4.6. The first overload is used for both the non-pointer types and the pointer types. Obviously, when using a pointer type, it conflicts with the second overload. If I comment out the second one and call the following using the first one...
#xA;... the corresponding console output is:
#xA;How is it possible that a non-pointer type (according to std::is_pointer
) is also a pointer type (according to typeid
) in the same context? The conflict arises between both overloads due to std::is_pointer
wrongly reporting p
as a non-pointer type. Also, when I replace the r-value reference with a standard reference in the first overload:
It doesn't conflict with the second overload anymore... I simply don't get what's going on. By the way, using the second overload yields (as would be expected):
#xA;Thanks for your help.
c++ - enable_if'edテンプレートテンプレートコンストラクターの型署名?
私は通常、クラスとテンプレートを宣言し、その後にそれらのメソッドを定義します(もちろん、同じヘッダーファイルで)。私はそのように読むほうが簡単だと思います。さて、クラス外の定義で使用する作業型シグネチャを理解できない場合があります。これが私がしていることの簡単な例で、問題を説明しています:
一致する署名を取得するためにスロット内でいくつかのことをWHAT_GOES_HERE
試みましたが、失敗し続けます。タイプTの2つのオブジェクトを渡す場合と、イテレータのペアを渡す場合を区別するために、enable_ifが必要です。テンプレート化されたコンストラクターがメインテンプレート内で定義されている場合、コードは正常に機能します。これは、コードが現在行っている方法ですが、定義を宣言の外に移動したいと思います。
編集: enable_if <...>はそのタイプにデフォルト値を割り当てるため、定義でenable_if <...>を再利用することはできません。これは、そうでない定義では実行できません。また、宣言。
c++ - 特定のメンバー メソッドを持つ C++ テンプレート型
テンプレート型のメンバー関数を呼び出す良い方法は何ですか? 以下のコードは、関数が定義されfoo()
ている型に対してのみコンパイルされますか?bla()
メソッドboost::enable_if
を持つ型に対してのみこの関数を定義するために使用できますか? bla()
はいの場合、それは良い考えですか?ここで使用する必要があるのは、おそらく「概念」(私はそれについて何も知りません) のアイデアだと思います。
c++ - クラステンプレート引数に基づいてC++メンバー関数を特殊化する
2つのスタイルのデータのどちらを含めるかを決定するテンプレートパラメータを持つクラスがあります。そのパラメーターに基づいて、2つの異なる方法のいずれかでメンバー関数を実装したいと思います。Boost Enable-Ifを使用してみましたが、成功しませんでした。これが私が最も驚いたコードのバージョンが機能しないことです:
これに対して、g++4.6.0は次のように述べています。
もちろん、2番目のオーバーロードは機能しないはずですが、SFINAEのために無視されるはずです。ダミー関数パラメーターを削除すると、g++は次のように言います。
そのため、最初にダミーパラメータを配置しました。ドキュメントの「コンパイラの回避策」セクションに従ってください。
基本的に私が欲しいのは、getRange()の2つの実装を持ち、Padタイプに基づいてどちらかを選択することです。私は、Enable-Ifが、作業を委任するための補助クラスを作成せずにそれを実行できるようになることを望んでいました(これについては、その間に試してみます)。
c++ - enable_if'dベースから継承
非charの配列の特性を部分的に特殊化しようとしています:
Visual Studio 2010は私にC2039を提供します( ...type
の要素ではありませenable_if
ん)。ただし、SFINAEは、コンパイラエラーを発生させるのではなく、ここでボトムアウトするべきではありませんか?または、この場合、SFINAEは適用されませんか?
もちろん、非文字と文字の特殊化を分離することもできます。
しかし、この特定のケースでSFINAEが機能しない理由を本当に知りたいと思います。
c++ - std::enable_if 特殊化の失敗
私は enable_if をいじっていましたが、一貫性のない動作に出くわしたようです。これはVS2010にあります。次のサンプルに縮小しました。
これはコードまたはコンパイラのバグですか?