トップページ > プログラム > 2019年09月09日 > L8mIN3PD

書き込み順位&時間帯一覧

3 位/170 ID中時間01234567891011121314151617181920212223Total
書き込み数0010000000002000011100006



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
909
C++相談室 part144

書き込みレス一覧

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;
}


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。