- C++相談室 part144
909 :デフォルトの名無しさん[sage]:2019/09/09(月) 02:56:10.10 ID:L8mIN3PD - std::is_pod とかってどうやって実装されてるんだろう。
コンパイラのビルトイン? それとも template で作られてる?
|
- C++相談室 part144
913 :909[sage]:2019/09/09(月) 12:06:40.11 ID:L8mIN3PD - >>911
自分で調査してみたところ、以下の様に、あなたのおっしゃるとおり、 中核部分は、__is_pod(クラス名) という「ビルトイン関数」を使っていました: // Could use is_standard_layout && is_trivial instead of the builtin. template<typename _Tp> struct is_pod : public integral_constant<bool, __is_pod(_Tp)> { }; /// integral_constant template<typename _Tp, _Tp __v> struct integral_constant { static constexpr _Tp value = __v; typedef _Tp value_type; typedef integral_constant<_Tp, __v> type; constexpr operator value_type() const noexcept { return value; } #if __cplusplus > 201103L #define __cpp_lib_integral_constant_callable 201304 constexpr value_type operator()() const noexcept { return value; } #endif };
|
- C++相談室 part144
915 :デフォルトの名無しさん[sage]:2019/09/09(月) 12:34:21.95 ID:L8mIN3PD - >>914
単純にQtだと思うが。
|
- C++相談室 part144
926 :デフォルトの名無しさん[sage]:2019/09/09(月) 17:05:42.93 ID:L8mIN3PD - std::list<int> l = { 7, 5, 16, 8 };
とすると、 l というリスト右辺で指定した要素で初期化した状態で作成されますが、 このときの std::list 自体の実装方法が知りたいです。 最新の C++ の方法論(?)によれば、右辺がコンパイラによって initiailer_list に なって、list のコンストラクタにそれが仮引数の型として宣言してあるものがあって、 そこで処理しているのかと思い、確認のため、 http://cs.brown.edu/people/jwicks/libstdc++/html_user/stl__list_8h-source.html ↑ で、std::list のソースを見てみると、initiailer_list というキーワードが見つかりません。 ではいったいどういう仕組みで初期化しているのでしょうか。 operator=() は見つかります。
|
- C++相談室 part144
932 :デフォルトの名無しさん[sage]:2019/09/09(月) 18:26:49.77 ID:L8mIN3PD - VC2019 の list ヘッダではちゃんと見つかりました。
みなさんありがとうございました。
|
- C++相談室 part144
934 :デフォルトの名無しさん[sage]:2019/09/09(月) 19:26:19.32 ID:L8mIN3PD - >>933
なお、_Tuple_element は、 tuple tpl; に対し、get<番号>(tpl) としたときに呼び出される以下のコードから使われます。 結論的には、template を書いた順序ではなく、パターンマッチングおける強弱のような もので優先順位が決まっているようです。それは丁度、同じ名前に仮引数の型だけが 異なる複数の関数 が overload 定義されている場合に、どの関数が呼び出されるかを 決めるときのアルゴリズムに似ているようです。詳しくは分かりません。 // FUNCTION TEMPLATE get (by type) template <class _Ty, class... _Types> _NODISCARD constexpr _Ty& get(tuple<_Types...>& _Tuple) noexcept { // get reference to _Ty element of tuple using _Ttype = typename _Tuple_element<_Ty, tuple<_Types...>>::_Ttype; return ((_Ttype&) _Tuple)._Myfirst._Val; }
|