先頭へ戻る

テンプレートの特殊化 解答ページ | Programming Place Plus C++編【言語解説】 第23章

Programming Place Plus トップページ -- C++編

先頭へ戻る

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

問題①

問題① 部分特殊化の1つ目のパターン「T型を T*型で部分特殊化する」において、ポインタであるかそうでないかによって、printメンバ関数の実装を変えられることを示しました。同様のことを、関数テンプレートで行うとすれば、どう実装しますか?


関数テンプレートは部分特殊化できませんが、大抵の場合、オーバーロードで代用できます。

#include <iostream>

template <typename T>
inline void Print(T v)
{
    std::cout << v << std::endl;
}

template <typename T>
inline void Print(T* p)
{
    std::cout << *p << std::endl;
}

int main()
{
    int a = 10;

    Print(a);
    Print(&a);
}

実行結果:

10
10

厳密なルールは複雑ですが、ある関数呼び出しについて、合致する関数が複数ある場合、より良く一致するものが選択されます。実引数がポインタであれば、単なる T型の仮引数を持つ関数よりも、T*型の仮引数を持つ関数の方が優先されます。

なお、次のように、クラステンプレートの部分特殊化を用意して対応する方法もあります。

#include <iostream>

template <typename T>
struct Printer {
    static inline void Print(T v)
    {
        std::cout << v << std::endl;
    }
};

template <typename T>
struct Printer<T*> {
    static inline void Print(T* p)
    {
        std::cout << *p << std::endl;
    }
};


template <typename T>
inline void Print(T v)
{
    Printer<T>::Print(v);
}

template <typename T>
inline void Print(T* p)
{
    Printer<T*>::Print(p);
}

int main()
{
    int a = 10;

    Print(a);
    Print(&a);
}

実行結果:

10
10

問題②

問題② 標準ライブラリに含まれる STLコンテナ、「vector」「list」「deque」「set」「map」は、それぞれどんなデータ構造を提供しますか?


これら STLコンテナは、C++プログラミングを楽にするために、非常に重要です。少しずつでも練習して、使いこなせるようになってください。

vector(【標準ライブラリ】第5章)は、動的配列を提供します。重要な STLコンテナの中でも、特に群を抜いて使用頻度・使用価値が高いので、確実に理解すべきです。

list(【標準ライブラリ】第6章) は、双方向連結リスト(アルゴリズムとデータ構造編【データ構造】第4章)です。

deque(【標準ライブラリ】第7章) は、両端待ち行列(アルゴリズムとデータ構造編【データ構造】第11章)です。

set(【標準ライブラリ】第8章) は、ソートされた集合を提供します。格納する値そのものを、ソートためのキーとして使用する点が、map との違いになっています。通常、木構造を使って実装されます。

map(【標準ライブラリ】第9章) も set と同様に、ソートされた集合を提供します。set が、格納する値そのものを、ソート順を定義するキーとして使用するのに対し、map は、キーと値を分けており、互いをペアにして格納します。通常、木構造を使って実装されます。


参考リンク


更新履歴

'2015/12/20 新規作成。



第23章のメインページへ

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー