質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2881閲覧

std::initializer_listは自作可能か?

tometome

総合スコア27

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/07/27 06:06

編集2019/07/27 12:25

自分で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);の違いを理解していません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nskydiving

2019/07/27 15:26

「include/initializer_listを見ましたが」というのは「initializer_listのソースコードを見た」という意味ですか? もしそうであれば、それが答えになると思いますが?
guest

回答1

0

ベストアンサー

そもそも自作は可能なのですか?

自作はできないようです。std::initializer_listは、コンパイラが認識する特別な引数型とのことです。
N2215 Initializer lists (Rev. 3)より)

コンパイラは、例えば、

cpp

1struct X { 2 X(std::initializer_list<double> v); 3}; 4X x{ 1,2,3 };

xの初期化を、

cpp

1const double __a[3] = {double{1}, double{2}, double{3}}; 2X x(std::initializer_list<double>(__a, __a+3));

とほぼ同じ方法で実装するようです。
([dcl.init.list]/5より)

gcc のinitializer_listの実装では、std::initializer_list<double>(__a, 3)になりそうでした。

また、std::initializer_listは、その実装には該当するコンストラクタが無いにも関わらず、空でない初期化子リストを作成することができるようです。
(std::initializer_list<T>::initializer_list - cppreference.comより)

初期化については、初期化 - cppreference.comを参照してください。
この場合は、type ob = {1, 2, 3};コピーリスト初期化type ob(1, 2, 3);直接初期化だと思われます。

投稿2019/07/27 17:14

alphya

総合スコア124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tometome

2019/07/27 23:13

英語での検索スキルが必須ですね。回答ありがとうございます!さすがです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問