tgoop.com/cppproglib/6084
Create:
Last Update:
Last Update:
Если нужно запретить автоматический вывод типов для некоторых параметров шаблона, то std::type_identity
поможет решить эту проблему.std::type_identity
из C++20 — простая обертка, которая предотвращает template argument deduction. Полезно для создания non-deduced contexts
.
👉 Определение:
template<typename T>
struct type_identity { using type = T; };
template<typename T>
using type_identity_t = typename type_identity<T>::type;
💡 Примеры использования:
// БЕЗ type_identity - тип T выводится автоматически
template<typename T>
void convert_and_print(T from, T to) { /* ... */ }
convert_and_print(1, 2.5); // Ошибка: T не может быть int и double
// С type_identity - принуждаем указать тип явно
template<typename T>
void convert_and_print(T from, std::type_identity_t<T> to) {
std::cout << static_cast<T>(to) << std::endl;
}
convert_and_print<double>(1, 2.5); // OK: T = double}
💡 Функции сравнения:
template<typename T>
bool equal(const T& a, std::type_identity_t<const T&> b) {
return a == b;
}
std::string str = "hello";
equal(str, "hello"); // OK: T = std::string, второй параметр - const char*
🔍 Factory с явным указанием типа:
template<typename T>
std::unique_ptr<T> make_initialized(std::type_identity_t<T> init_value) {
return std::make_unique<T>(init_value);
}
// Тип нужно указать явно
auto ptr = make_initialized<std::string>("Hello World");
Библиотека C/C++ разработчика
#буст