19.1 — Template classes


https://www.learncpp.com/cpp-tutorial/template-classes/
前章でfunctiontemplateについてお話ししました
function templateはまた、他のタイプのfunctionを実現するのに役立ちます.
これらのテンプレートを見てみましょう

Templates and container classes


テンプレートをクラスに結合し、汎用化されたコンテナクラスを作成できます.
Array.h:
#ifndef ARRAY_H
#define ARRAY_H

#include <cassert>

template <typename T> // added
class Array
{
private:
    int m_length{};
    T* m_data{}; // changed type to T

public:

    Array(int length)
    {
        assert(length > 0);
        m_data = new T[length]{}; // allocated an array of objects of type T
        m_length = length;
    }

    Array(const Array&) = delete;
    Array& operator=(const Array&) = delete;

    ~Array()
    {
        delete[] m_data;
    }

    void erase()
    {
        delete[] m_data;
        // We need to make sure we set m_data to 0 here, otherwise it will
        // be left pointing at deallocated memory!
        m_data = nullptr;
        m_length = 0;
    }

    T& operator[](int index) // now returns a T&
    {
        assert(index >= 0 && index < m_length);
        return m_data[index];
    }

    // templated getLength() function defined below
    int getLength() const;
};

// member functions defined outside the class need their own template declaration
template <typename T>
int Array<T>::getLength() const // note class name is Array<T>, not Array
{
  return m_length;
}

#endif
function templateと同様にclass Array宣言の真上に
templateを追加し、Tを操作できるようにします.
外部でmember関数を定義する場合、
template < typename T >
int Array< T >::getLength() const
このようにtemplateとクラス名の後にTを追加して定義する
ここではmain関数の使用例です
#include <iostream>
#include "Array.h"

int main()
{
	Array<int> intArray { 12 };
	Array<double> doubleArray { 12 };

	for (int count{ 0 }; count < intArray.getLength(); ++count)
	{
		intArray[count] = count;
		doubleArray[count] = count + 0.5;
	}

	for (int count{ intArray.getLength() - 1 }; count >= 0; --count)
		std::cout << intArray[count] << '\t' << doubleArray[count] << '\n';

	return 0;
}

Template classes in the standard library


classtemplateについて理解しました.
STLを作成する場合、std::vectorのような形でtypeを作成する理由が理解できます.

Template classes in the standard library


普通のnon-templateクラスのように
classはheaderファイルに定義されます.
cppでmember関数を定義します.
template classで問題が発生する
この問題を解決する最も簡単な方法はheaderファイルでtemplateクラスのすべてのコードを実行することです.
欠点は、templateクラスが他の多くのファイルで使用されている場合、ローカルコピーが多く発生することです.
コンパイルとリンク時間が増加します
compileor link timeが問題でない場合は、上記の方法が優先です.
それ以外にも、いろいろな方法があります.もしあなたが知りたいなら、探してみてください.
省略する