メンバ関数テンプレート 解答ページ | Programming Place Plus C++編【言語解説】 第33章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① 次のようなクラスがあります。

template <typename T>
class DataStoreArray {
public:
    void Push(const T& data)
    {
        mVec.push_back(data);
    }

private:
    std::vector<T> mVec;
};

このクラスに、保持している要素を、STLコンテナにコピーして返すようなテンプレート変換演算子を追加してください(map はキーと値のペアが必要になるので省いて良いです)。つまり、以下の変換を可能にしてください。

DataStoreArray<int> store;

std::vector<int> v = store;
std::list<int> l = store;
std::set<int> s = store;


次のように、テンプレート変換演算子を定義すれば良いでしょう。

template <typename T>
class DataStoreArray {
public:
    template <typename U>
    operator U() const
    {
        return U(mVec.begin(), mVec.end());
    }
};

各STLコンテナのコンストラクタは、イテレータのペアを使って初期値を指定できるので、これを利用すれば簡単なコードで済みます。

これがあれば、以下のコードが動作します。

#include <iostream>
#include <vector>
#include <list>
#include <set>

template <typename T>
class DataStoreArray {
public:
    void Push(const T& data)
    {
        mVec.push_back(data);
    }

    template <typename U>
    operator U() const
    {
        return U(mVec.begin(), mVec.end());
    }

private:
    std::vector<T> mVec;
};

template <typename T>
void Print(const T& container)
{
    const T::const_iterator itEnd = container.end();
    for (T::const_iterator it = container.begin(); it != itEnd; ++it) {
        std::cout << *it << "\n";
    }
    std::cout << std::endl;
}

int main()
{
    DataStoreArray<int> store;
    store.Push(3);
    store.Push(5);
    store.Push(7);

    std::vector<int> v = store;
    std::list<int> l = store;
    std::set<int> s = store;

    Print(v);
    Print(l);
    Print(s);
}

実行結果:

3
5
7

3
5
7

3
5
7


参考リンク

更新履歴

’2016/11/5 新規作成。



第33章のメインページへ

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

Programming Place Plus のトップページへ



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