19.1 — Template classes
https://www.learncpp.com/cpp-tutorial/template-classes/
前章でfunctiontemplateについてお話ししました
function templateはまた、他のタイプのfunctionを実現するのに役立ちます.
これらのテンプレートを見てみましょう
Templates and container 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が問題でない場合は、上記の方法が優先です.
それ以外にも、いろいろな方法があります.もしあなたが知りたいなら、探してみてください.
省略する
Reference
この問題について(19.1 — Template classes), 我々は、より多くの情報をここで見つけました
https://velog.io/@ikmy0ung/19.1-Template-classes
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#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
外部で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
Template classes in the standard library
普通のnon-templateクラスのように
classはheaderファイルに定義されます.
cppでmember関数を定義します.
template classで問題が発生する
この問題を解決する最も簡単な方法はheaderファイルでtemplateクラスのすべてのコードを実行することです.
欠点は、templateクラスが他の多くのファイルで使用されている場合、ローカルコピーが多く発生することです.
コンパイルとリンク時間が増加します
compileor link timeが問題でない場合は、上記の方法が優先です.
それ以外にも、いろいろな方法があります.もしあなたが知りたいなら、探してみてください.
省略する
Reference
この問題について(19.1 — Template classes), 我々は、より多くの情報をここで見つけました https://velog.io/@ikmy0ung/19.1-Template-classesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol