<? extends T>
,<? super T>
はC++に相当しますか?C++に<? extends T>,<? super T>の相当語はありますか?また、
T
がJavaのインターフェイスでも、<? extends T>
,<? super T>
が機能しますか?
答えて
JesperEは、第二の部分のための答えの権利を有します。
引数として渡されたクラスに必要なメソッドが定義されている場合、fool-proofチェックが行われるというルールに従います。 承認されたクラスには、すべての必要な機能があります。しかし、その逆は必ずしも真実ではない。 <のようなものがあれば? extends T>なら、クラス階層を明示的に指定しているので馬鹿です。 – user855
@ajay:型パラメータを基底クラスに制限する場合は、基本クラスインタフェースを正確に使用するため、テンプレート?参照によって基本クラスを操作できますか?これはあなたが探しているタイプの安全性を得るでしょう。テンプレートを使用すると、同じ階層に属していなくても動作する操作を定義できます。それが彼らの力です。あなたの状況でこれが実現できない場合は、あなたがしようとしていることと、それを達成するのに役立つC++機能の詳細についての質問を更新することができます。 –
? extendsは、basetypeの任意のサブクラスを意味します。 – TofuBeer
2番目の質問に答える:はい。ジェネリックに関する限り、インターフェースは実際のクラスと同じように扱われます。
最初の質問は、より多くのC++に精通した人に任せます。最初の部分に
Javaのようにかなり良い構文糖はありませんが、boost/type_traitsでうまく管理できます。 詳細については、http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/index.htmlを参照してください。
#include <boost/type_traits.hpp>
#include <boost/static_assert.hpp>
class Base {};
class Derived_from_Base : public Base {};
class Not_derived_from_Base {};
template<typename BASE, typename DERIVED>
void workOnBase()
{
BOOST_STATIC_ASSERT((boost::is_base_of<BASE, DERIVED>::value));
}
int main()
{
workOnBase<Base, Derived_from_Base>(); // OK
workOnBase<Base, Not_derived_from_Base>(); // FAIL
return 0;
}
1> D:... \ main.cppに(11):エラーC2027:未定義のタイプを使用する 'ブースト:: STATIC_ASSERTION_FAILURE' 1>と 1> [ 1> X = falseを 1>]
C++でテンプレートパラメータの範囲を制限するには、さまざまな特性メカニズムを使用します。その中には、ブーストで使用できる実装があります。
通常、JavaとC#で構文が存在するのは、テンプレートではなくジェネリックを使用しているからです。
Javaジェネリックスは、テンプレート引数として使用される各タイプのコードを生成するのではなく、基本型からの仮想ディスパッチを使用する共有コードを生成します。したがって、通常は、テンプレートパラメータとして使用される型のオブジェクトのメソッドを呼び出すために、この制限を使用しています。
C++では、テンプレートパラメータとして使用される各型のコードが生成されるため、基本型について知る必要はありません。
たとえば、マトリックスのテンプレートクラスでは、ターゲットタイプで+、 - 、*演算子が使用されます。 Inは、これらの演算子をサポートするすべての型に対して使用できます。任意にdouble
sとint
sに制限されていた場合は、complex<double>
のテンプレートを使用することはできません。また、区間演算をサポートする型のテストを実行することもできません。それらを使用します。
同じ形状を持つ任意の型に対して作業する能力は、テンプレートの力であり、より便利になります。そのタイプを(コンパイルされている限り)使用することが有効かどうかを判断するのはクライアントコードに任されており、顧客は常に正しいです。同じ形をした任意の型に対して作業できないこと、およびjava.lang.Object
以外のメソッドを呼び出すための制限を指定する必要性は、ジェネリックの弱点です。
extensionこれは、「準備ができていませんでした」という悲しいことに、C++ 0xのドラフト標準から削除されました。しかし、静的なアサート(これはC++ 0xとBoostの一部です)を使ってこれをシミュレートすることは可能です。
これが私の仕事:
#include <iostream>
class MyBase {};
class A : public MyBase {};
class B {};
template <class T>
typename std::enable_if<!std::is_base_of<MyBase, T>::value>::type
Foo(T &v) {
std::cout << "Foo 1" << std::endl;
}
template <class T>
typename std::enable_if<std::is_base_of<MyBase, T>::value>::type
Foo(T &v) {
std::cout << "Foo 2" << std::endl;
}
int main() {
A a;
B b;
Foo(a);
Foo(b);
return 0;
}
質問は 'is_base_of'よりも前に(そしてそれについては' enable_if')、今日はこれがデフォルトの解決策でなければなりません – Ap31
- 1. Kerberos TGTの動作
- 2. ケルベロスチケットのパスTGTとサービスチケットは、Windows XPとunixにありますか?
- 3. <U、T extends U>と<T、U super T>は同じですか?
- 4. C++には、HTML <canvas></canvas>とJS fillRectに相当するものがありますか?
- 5. <T extends Comparable>のC#に相当するものは、Comparable <Transition <T>>を実装していますか?
- 6. Javaクラス<?>相当のC#
- 7. VBAは<i> "text"</i>に相当しますか?
- 8. Cのstd :: aligned_storage <>に相当しますか?
- 9. Javaのジェネリックは、C <T extends MyClass <Z>>メソッドはZを返す必要があります
- 10. JSF <ui:debug />タグに相当するXPagesはありますか?
- 11. LSAキャッシュからTGTチケットを取得できません
- 12. GSSManager.createCredentialはKerberosキーとTGTをどのように取得しますか?
- 13. RxJs5のRxJs <= 4#ofArrayChangesに相当するものがありますか
- 14. C++ std :: partial_sortに相当するC#はありますか?
- 15. .NETのPredicate <T>メソッドに相当するJava 1.5がありますか?
- 16. MIT KerberosがMSLSAキャッシュでTGTの検索に失敗する
- 17. Windows上のKerberos TGTセッションキーがすべて0になる原因
- 18. Collections.sort()の宣言:</p> <pre><code>public static <T extends Comparable<? super T>> void sort(List<T> list) </code></pre> <p>及びません:<? super T>ではなく<T>
- 19. Java 8のjava.util.function.Consumer <>のC#に相当するものは何ですか?
- 20. のArrayList(コレクション<? extends E> C)
- 21. C#:JTableに相当するものはありますか?
- 22. C#のWindows.UI.Xaml.Application.OnActivatedイベントに相当するJavaScriptはありますか?
- 23. JavaのFile.separatorに相当するC#はありますか
- 24. Rubyの `respond_to?`に相当するC#はありますか?
- 25. C++でC#に相当するものは<map>ですか?
- 26. Java述語に相当するC/C++
- 27. リスト<? extends MyType>
- 28. STL出力イテレータに相当するC#はありますか?
- 29. Swift/Obj-C/iOSに相当するルビーコンソールはありますか?
- 30. C#7.0に相当するMicrosoft.Net.Compilersはありますか?
をあなたがこれを必要ですか?このJava機能をエミュレートしようとするよりも単純で、よりC++のようなソリューションがあるかもしれません。 – jalf