Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ クラステンプレート引数推論 | イントロダクション
C++テンプレート

bookクラステンプレート引数推論

メニューを表示するにはスワイプしてください

最初はテンプレートであることに気付かずに、すでにいくつか使用していたかもしれません。これはクラス テンプレート引数推論(CTAD)が理由の場合があります。

C++17からは、クラス テンプレート引数推論(CTAD)を利用可能です。この機能により、テンプレート型を明示的に指定せずにテンプレートクラスのインスタンスを作成できます。コンパイラがコンストラクタのパラメータから型を推論します。std::pairを使った例を見てみましょう。

main.cpp

main.cpp

copy
12345678
#include <iostream> #include <utility> // for std::pair int main() { std::pair<int, char> my_pair(1, 'a'); std::cout << my_pair.first << " : " << my_pair.second << std::endl; }

注意

以前は、std::pair のインスタンスを作成する唯一の方法でした。しかし、現在は <int, char> 部分を省略することが可能です。これを削除して、もう一度コードを実行してみてください。

クラスのテンプレート引数推論は、テンプレート引数リストが指定されていない場合にのみ行われます。テンプレート引数リストが指定されている場合、推論は行われません。

main.cpp

main.cpp

copy
12345678
#include <iostream> #include <utility> // for std::pair int main() { std::pair<> my_pair(1, 'a'); // Error std::cout << my_pair.first << " : " << my_pair.second << std::endl; }

クラステンプレートの特定の型に一致する単一の引数でオブジェクトを作成する場合、CTAD(クラステンプレート引数推論)はその型を直接使用し、ユーザー定義テンプレートクラスのインスタンス化を簡素化します。たとえば、Box のようなテンプレートクラスでは、コンストラクタ引数を指定するだけで型引数を明示せずにインスタンス化できます。

main.cpp

main.cpp

copy
123456789101112131415
#include <iostream> template <typename T> class Box { T value; public: Box(T value): value(value) {} }; int main() { // No need to write Box<int> a{1}; Box a{1}; // Deduction: Box<int> Box b{a}; // Deduction: Box<int>, not Box<Box<int>> }

CTAD を利用することでコードの保守が容易になります。基になる型が変更された場合でも更新するコードが少なくなり、エラーの機会が減少します。

vector.h

vector.h

copy
12345678
template <typename T> class Vector3D { T x, y, z; public: Vector3D(T x, T y, T z) : x(x), y(y), z(z) {} }; Vector3D vec{1.0, 2.0, 3.0}; // CTAD deduces Vector3D<double>

特定のコンストラクタを持つコンテナやラッパーを使用する場合、CTAD(クラス テンプレート引数推論)によってコードが簡潔になります。たとえば、基礎データ型をラップするカスタムの MatrixVector クラスがあるとします。ここでCTADを利用することで、引数に基づいて型推論が自動的に行われ、可読性と柔軟性が向上します。

question mark

クラス テンプレート引数推論(CTAD)とは何ですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  12

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  12
some-alt