これまで私はELI5をオンラインで見つけることができませんでした。学習プロジェクトのために、自分のis_constructibleを実装したいと思います。誰かがそれがどのように動作するか説明できますか?std :: is_constructible <T, Args>はどのように実装されていますか?
cppreference答えて
より:
変数定義
T obj(std::declval<Args>()...);
F [I]は他value
をfalse
で、value
はtrue
に等しく、十分に形成されています。template <class...> using void_t = void; template <class, class T, class... Args> struct is_constructible_ : std::false_type {}; template <class T, class... Args> struct is_constructible_< void_t<decltype(T(std::declval<Args>()...))>, T, Args...> : std::true_type {}; template <class T, class... Args> using is_constructible = is_constructible_<void_t<>, T, Args...>;
using
フープ:
コードは、例えば、SFINAE技術を用いて行うことができる(C++ 1Z標準ライブラリの一部であると期待される)void_t<>
トリックよく形成されているかどうかを確認最初にvoid_t<>
引数を配置することです。通常は最後にデフォルトタイプがありますが、その位置はvariadic Args
パックによって保持されます。
が<void, T, Args...>
でインスタンス化されると、コンパイラはまず特殊化をインスタンス化しようとします。これは、is_constructible
の要件で指定されているように、の内容が意味的に有効である場合、つまりT(std::declval<Args>()...)
が正しく実行された場合にのみ成功します。ローカル変数の代わりに一時変数を使用していますが、私の知る限り、ルールは2つの間で変更されません。専門化はstd::true_type
から継承され、true
value
が得られます。
特殊化をインスタンス化できない場合(つまり、T(std::declval<Args>()...)
が無効な場合)、コンパイラは常にインスタンス化できる一般的なテンプレートに戻ります。これはstd::false_type
から継承し、false
value
となります。
より正確な特性は、そのようstd::is_trivially_constructible
として、その有効性形質の値となるべき表現を作るために言語規則のより高度な知識が必要です。これがstd::is_standard_layout
のように言語の内側から実行不可能であると判明した場合、コンパイラ自体はその値を取り出すための組み込み関数を提供しなければならない。
- 1. std :: stoiはどのように実装されていますか?
- 2. True <2はどのように実装されていますか?
- 3. リスト内のstd :: is_constructible
- 4. なぜstd :: findはこのように実装されていますか?
- 5. @privateはどのように実装されていますか?
- 6. BigDecimalはどのように実装されていますか?
- 7. HttpSessionはどのように実装されていますか?
- 8. removeEventListenerはどのように実装されていますか?
- 9. INativeElementViewはどのように実装されていますか?
- 10. PTRACE_SINGLESTEPはどのように実装されていますか?
- 11. テンソルフローはどのように実装されていますか?
- 12. \ bはどのように実装されていますか?
- 13. フィルタはどのように実装されていますか?
- 14. MarshalByRefObjectはどのように実装されていますか?
- 15. クロスバリデーションはどのように実装されていますか?
- 16. タスクスケジューリングはどのように実装されていますか?
- 17. os.path.fileはどのように実装されていますか?
- 18. getchar()はどのように実装されていますか?
- 19. モバイルバックグラウンドループはどのように実装されていますか?
- 20. エクスポートテンプレートはどのように実装されますか?
- 21. VB.NETでIEqualityComparer <T>をどのように実装しますか?
- 22. Collection.sortがどのように実装されていますか?
- 23. Wami Recorderは実際にどのように実装されていますか?
- 24. C++ 11 `std :: string ToString(std :: tuple <Args...>&t)`の実装方法は?
- 25. にはどうすればいいのstd ::アトミック<T>上の単純なスピンロックを実装していますか?
- 26. .NETのConcurrentBag <T>のようなクラスはどのように実装できますか?
- 27. <はstd :: reference_wrapper <T>>はstd ::ベクトルします<T>
- 28. linuxではclock_gettimeがどのように実装されていますか?
- 29. IEnumerable <T>を実装するにはどうすればよいですか?
- 30. Objective Cではカテゴリはどのように実装されていますか?
それは優れた説明だった、ありがとう! – Alex
'T(Arg)'はCスタイルのキャストと等価であるため、 'is_constructible'は 'true'であるため、これは' std :: is_constructible'と全く同じではありません。 std'はfalseを返します。 –