クラステンプレート引数推論
メニューを表示するにはスワイプしてください
最初はテンプレートであることに気付かずに、すでにいくつか使用していたかもしれません。これはクラス テンプレート引数推論(CTAD)が理由の場合があります。
C++17からは、クラス テンプレート引数推論(CTAD)を利用できます。この機能により、テンプレート型を明示的に指定せずにテンプレートクラスのインスタンスを作成できます。コンパイラがコンストラクタのパラメータから型を推論します。std::pairを使った例を見てみましょう。
main.cpp
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
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
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
12345678template <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(クラス テンプレート引数推論)によってコードが簡潔になります。たとえば、基礎データ型をラップするカスタムの Matrix や Vector クラスがあるとします。ここで CTAD を利用することで、引数に基づいて型推論が自動的に行われ、可読性と柔軟性が向上します。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください