initializer_list 解答ページ | Programming Place Plus Modern C++編【標準ライブラリ】 第8章

トップページModern C++編 C++編](../../index.html) – 第8章

Modern C++編は作りかけで、更新が停止しています。代わりに、C++14 をベースにして、その他の方針についても見直しを行った、新C++編を作成しています。
Modern C++編は削除される予定です。

問題①

問題① 次のように呼び出すことができる関数 f を作成してください。

f({0, 1, 2});


実引数で、{ } を使った初期化リストを指定するには、関数の仮引数を std::initializer_list にすればよいです。

#include <initializer_list>
#include <iostream>

void f(std::initializer_list<int> lst)
{
    for (int v : lst) {
        std::cout << v << std::endl;
    }
}

int main()
{
    f({ 0, 1, 2 });
}

実行結果:

0
1
2

問題②

問題② 次のコードが動作するように、MyClass を実装してください。受け取った要素は、メンバ変数の std::vector に保存するようにしてください。

int main()
{
    MyClass mc = {0, 1, 2};
    mc = {9, 8, 7};
}


リスト初期化を受け付けるには、仮引数が std::initializer_list のコンストラクタを定義します。初期化リストは std::initializer_list に変換されるので、結局、これがあれば代入も可能になります。

以下、実装例です。確認のため Printメンバ関数も実装しています。

#include <initializer_list>
#include <iostream>
#include <vector>

class MyClass {
public:
    MyClass(std::initializer_list<int> lst) :
        mElems(lst)
    {
    }

    void Print() const
    {
        for (int e : mElems) {
            std::cout << e << std::endl;
        }
    }

private:
    std::vector<int>  mElems;
};

int main()
{
    MyClass mc = { 0, 1, 2 };
    mc.Print();

    mc = { 9, 8, 7 };
    mc.Print();
}

実行結果:

0
1
2
9
8
7

std::vector にも、仮引数が std::initializer_list のコンストラクタがあるので(第6章)、初期化リストをそのまま引き渡せます。



参考リンク


更新履歴

’2017/12/6 新規作成。



第8章のメインページへ

Modern C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る