問題タブ [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++ - enable_if を使用する関数の前方宣言: あいまいな呼び出し
を使用する関数を前方宣言するのに問題がありますboost::enable_if
。次のコードではコンパイラ エラーが発生します。
コンパイル時に、「foo へのあいまいな呼び出し」エラーが発生します。の定義によるとenable_if
、'type' typedefvoid
は条件が true の場合に対応するため、私が見る限り、2 つのシグネチャはfoo
一致します。なぜコンパイラはそれらが異なると考えるのですか?また、前方宣言する正しい方法はありますかfoo
(できれば、その部分を繰り返さないでenable_if
ください)?
c++ - 特定の型特性を持つすべての型の関数テンプレートを作成するにはどうすればよいですか?
次の例を検討してください。
このScanner
クラスは、何らかのソースからトークンを抽出するために使用されます。上記のコードは問題なく動作しますが、 aや anget
などの他の整数型にしようとすると失敗します。これらの型を読み取るコードは、 を読み取るコードとまったく同じです。読みたい他のすべての整数型のコードを複製することもできますが、すべての整数型に対して 1 つの関数テンプレートを定義したいと思います。char
unsigned int
int
私は次のことを試しました:
Scanner::get<string>()
これは魅力のように機能しますが、再び機能する方法がわかりません。では、単一の定義ですべての整数型を読み取ることができるように、コードを作成するにはどうすればよいscanner.get<string>()
でしょうか?scanner.get<any integral type>()
更新: おまけの質問: いくつかの特性に基づいて複数の範囲のクラスを受け入れたい場合はどうすればよいですか? たとえば、 get
(i) 整数型 (ii) 浮動小数点型 (iii) 文字列をそれぞれ受け入れる 3 つの関数が必要な場合、この問題にどのようにアプローチすればよいでしょうか。
c++ - enable_if と変換演算子?
enable_if
型変換演算子で使用する機会はありますか? 戻り値の型とパラメーター リストの両方が暗黙的であるため、注意が必要です。
c++ - C++0x の disable_if はどこにありますか?
Boost には と の両方がenable_if
ありdisable_if
ますが、C++0x には後者がないようです。なぜそれは取り残されましたか?C++0x にメタプログラミング機能がdisable_if
あり、enable_if
.
std::enable_if
ああ、それは基本的に であり、C++0xboost::enable_if_c
のようなものは存在しないことに気付きました。boost::enable_if
c++ - ネストされたクラスを使用した奇妙なenable_ifの動作(MSVCコンパイラのバグまたは機能?)
コードのデバッグにかなりの時間を費やした後、enable_ifを使用して、問題の理由を予期しないテンプレートの特殊化の結果まで追跡しました。
次のコードは、Visual Studio 2010(および2008)のDoTest()でのアサーションに失敗しますが、g++3.4.5では失敗しません。ただし、SomeClassからテンプレートを削除するか、 my_conditionをSomeClassのスコープ外に移動すると、MSVCでも機能します。
この動作を(少なくとも部分的に)説明するこのコードに何か問題がありますか、それともこれはMSVCコンパイラのバグですか?
(このサンプルコードを使用すると、boostとc ++ 0x stlバージョンで同じです)
条件をスコープ外に移動して修正しようとすると、std :: enable_ifを使用する場合でもこれでは不十分であることに気付きましたが、少なくともboost :: enable_if:で機能します。
誰かがこれについて説明してくれることを願っています。
c++ - enable_if + disable_ifの組み合わせにより、あいまいな呼び出しが発生します
この質問に答えようとしている間、型が多形である(またはそうでない)という事実に基づいてメソッドのオーバーロードを許可するためにenable_if
+の使用を提案したいと思いました。disable_if
そこで、小さなテストファイルを作成しました。
これはかなり飼いならされているようです。
しかし、gcc(3.4 ...)はこれを窒息させます:
test.cpp:関数内
int main(int, char**)
:
test.cpp:29:エラー:オーバーロードの呼び出しaddress_of(N*)
があいまいです
test.cpp:17:注:候補は次のとおりです:void* address_of(T*, boost::enable_if<boost::is_polymorphic<T>, void>*)
[T =Nの場合]
test.cpp:20:注:void* address_of(T*, boost::disable_if<boost::is_polymorphic<T>, void>*)
[T=Nの場合]
ここでどのオーバーロードを使用すべきかは、私の人間の心にはかなり明確に思えます。つまり、代替を定義したことは明らかであり、一度に使用できる関数は1つだけです...そして、SFINAEが不要な過負荷の無効化を処理すると思いました。
ダミーの2番目の引数の...
代わりに(省略記号)を使用してパッチを適用しました...しかし、コンパイラがこれをチョークする理由にはまだ興味があります。disable_if
c++ - C++ ブースト enable_if の質問
次のステートメントを簡単にする方法はありますか? (おそらく、 を使用boost::enable_if
) .
私は単純なクラス構造を持っています-Base
基本クラス、、Derived1
からDerived2
継承しBase
ます。
次のコードがあります。
の 1 つのテンプレート特殊化を使用して、同じステートメントを記述したいと考えていtranslator_between
ます。
私が書きたいものの例(疑似コード):
とを使用してこれを達成する方法はboost::enable_if
ありboost::is_base_of
ますか?
c++ - このテンプレート関数で型を推測できないのはなぜですか?
read<int>を指定すると機能します。引数から型を推測する方法はありますか?
c++ - ブースト enable_if 問題
これはブースト ドキュメントから多かれ少なかれコピーして貼り付けたものであり、エラーが発生し続けます (実際には多くのエラーが発生します)。
テンプレート クラスがブーストを使用して数値でのみ使用されるようにしようとしています。これは、数値のみを使用するテンプレート クラスを作成するのではなく、boost の演習です。
最初のいくつかのエラー C2143: 構文エラー: ';' がありません '<' の前: 9 行目 C2059: 構文エラー: '<' : 9 行目 C2899: テンプレート宣言の外では typename を使用できません
Visual Studio 2005 ところで。
c++ - 疎結合の暗黙的な変換
暗黙的な変換は、型が意味的に同等である場合に非常に役立ちます。たとえば、同じ型を実装しているが名前空間が異なる 2 つのライブラリがあるとします。または、あちこちのセマンティックシュガーを除いて、ほとんど同じタイプです。関数がテンプレートでない限り、一方の型を他方を使用するように設計された (これらのライブラリの 1 つの) 関数に渡すことはできません。そうでない場合は、何らかの方法で一方の型を他方の型に変換する必要があります。これは些細なことであるはずです (そうでなければ、型は結局のところそれほど同一ではありません!) が、変換を明示的に呼び出すと、ほとんど意味のない関数呼び出しでコードが肥大化します。このような変換関数は実際にはいくつかの値をコピーする可能性がありますが、高レベルの「プログラマー」の観点からは本質的に何もしません。
暗黙の変換コンストラクターと演算子は明らかに役立つ可能性がありますが、それらはカップリングを導入するため、それらの型の 1 つが他の型について知る必要があります。通常、少なくともライブラリを扱う場合はそうではありません。これらのタイプの 1 つが存在すると、他のタイプが冗長になるためです。また、常にライブラリを変更できるとは限りません。
これで、ユーザー コードで暗黙的な変換を機能させる方法について 2 つのオプションが表示されます。
1 つ目は、関連するすべての型に対して変換演算子と変換コンストラクタ (および代入) を実装するプロキシ型を提供し、常にそれを使用することです。
2 つ目は、ライブラリに最小限の変更を加えるだけで済みますが、大きな柔軟性が得られます。外部からオプションで有効にできる、関連する型ごとに変換コンストラクターを追加します。
たとえば、型の場合A
、コンストラクターを追加します。
とテンプレート
デフォルトで暗黙的な変換を無効にします。
次に、2 つの型の間の変換を有効にするために、テンプレートを特殊化します。
convert
ADL で見つけられる機能を実装します。
個人的には、強い反対意見がない限り、2 番目のバリアントを使用することを好みます。
実際の質問に移りましょう: 暗黙的な変換のために型を関連付ける好ましい方法は何ですか? 私の提案は良いアイデアですか?どちらのアプローチにも欠点はありますか? そのような変換を許可することは危険ですか? ライブラリの実装者は、一般に、使用されている可能性が最も高いソフトウェアで型が複製される可能性がある場合に 2 番目の方法を提供する必要があります (ここでは、これらのパッケージのほとんどが 3D を実装する 3D レンダリング ミドルウェアを考えています)。ベクター)。