自分でinitializer_listを作りたいのですが、そもそも自作は可能なのですか?もちろん機械語やアセンブリから書けば可能なのかもしれませんが、そういうことではなくて、c++でかけるかということです。頑張っていろいろ試行錯誤して書いてみましたが、このソースでは、initializer_listを仮引数にして初期化子リストを受け取れないのでinitializer_listではありません。include/initializer_listを見ましたが「なぜこれでこんな動作をするのか」と不思議に思うばかりです。もし自作が可能なのであればヒント(答え)を教えてください。
gcc バージョン8.2.0
lang
1//size(), begin()などは省略 2template <class E> class _initializer_list{ 3 const E *data; 4 size_t len; 5 6 template <class T> void init(const E &ob) noexcept {data = &ob - len++;} 7 template <class... T> void init(const E &n, const T&... arg) noexcept { 8 len++; 9 init<E>(arg...); 10 } 11public: 12 constexpr _initializer_list() noexcept : data(NULL), len(0){} 13 constexpr _initializer_list(const E &n) noexcept : data(&n), len(1){} 14 template <class... T> 15 _initializer_list(const T&... ob) noexcept : len(0) {init<E>(ob...);} 16 17};
lang
1#include<initializer_list> 2 3int main(){ 4 std::initializer_list<int> a(1, 2, 3); //コンパイルエラー 5 _initializer_list<int> b(1, 2, 3); //コンパイルエラーにはならないが動作がおかしい。コンパイルエラーになるようにするか、これでも初期化可能にしたい。 6 7 std::initializer_list<int> c = {1, 2, 3); //正常 8 _initializer_list<int> d = {1, 2, 3}; //これは正常 9 10 std::initializer_list<int> e; 11 e = {1, 2, 3}; //正常 12 13 _initializer_list<int> f; 14 f = {1, 2, 3}; //コンパイルエラー、代入演算子のオーバーロードをしたいが「仮引数は1つでなければならない」と言われ、できない 15 16 samp(stdのやつ) ob1 = {1, 2, 3}; //これをするためにstd::initializer_listがある 17 samp(作ったやつ) ob2 = {1, 2, 3}; //「samp(int, int, int)は無い」と言われる、これの直し方が一番知りたい。 18} 19struct samp{ 20 samp(std::initializer_list<int> &ils){/***/} //正常 21 samp(_initializer_list<int> &ils){/***/} //「samp(int, int, int)は無い」と言われる 22};
※追記
私はtype ob = {1, 2, 3};
とtype ob(1, 2, 3);
の違いを理解していません。
回答1件
あなたの回答
tips
プレビュー