Es ist ja bekannt, dass der Compiler die Template Parameter von Funktionen selbst bestimmen kann.
template<typename T> T func(T val) { return val; } auto i = func(1); // i int
Seit C++17 funktioniert das nun auch mit Klassen. Das Feature hierfür nennt sich __cpp_deduction_guides und wird seit GCC 7 unterstützt.
https://en.cppreference.com/w/cpp/language/class_template_argument_deduction
Mehr noch, es können User Guides angegeben werden. Mit denen wird festgelegt, wie genau sich der Type der Klasse ableiten soll.
Hier ein einfaches Beispiel:
#include <type_traits> #ifndef __cpp_deduction_guides #error "need gcc 7" #endif template<class T> struct A { using value_type = T; template<typename U, typename V> constexpr A(U, V) { } }; // Das ist der class template argument deduction user guide // Der gemeinsame Type von U und V soll T von der Klasse A sein. template<typename U, typename V> A(U, V) -> A<std::common_type_t<U, V>>; constexpr A x(1, 2.0); // Der gemeinsame Type von int und double ist double // Zur Compilezeit getestet! static_assert(std::is_same_v<decltype(x)::value_type, double>); // yeah
Sehr geiles feature.