Сообщение Re[4]: template (синтаксис) больше не нужен? от 05.11.2023 23:27
Изменено 05.11.2023 23:52 rg45
Re[4]: template (синтаксис) больше не нужен?
Здравствуйте, reversecode, Вы писали:
R>есть еще не помню кейс где SFINAE не будет работать
R>а концепт будет
А у SFINAE другая проблема: у него все перегрузки равноправны и нет способа сделать одну перегрузку "более специальной", чем другая. И иногда резолвить коллизии становится достаточно геморройно. С концептами этот вопрос решается гораздо проще:
http://coliru.stacked-crooked.com/a/068edfc7e85e1e14
R>есть еще не помню кейс где SFINAE не будет работать
R>а концепт будет
А у SFINAE другая проблема: у него все перегрузки равноправны и нет способа сделать одну перегрузку "более специальной", чем другая. И иногда резолвить коллизии становится достаточно геморройно. С концептами этот вопрос решается гораздо проще:
http://coliru.stacked-crooked.com/a/068edfc7e85e1e14
#include <iostream>
#include <type_traits>
#include <concepts>
template <typename T>
concept Number = std::is_arithmetic_v<T>;
template <typename T>
concept RealNumber = Number<T> && std::is_floating_point_v<T>;
void foo(Number auto t) { std::cout << "Number: " << t << std::endl; }
void foo(RealNumber auto t) { std::cout << "Real Number: " << t << std::endl; }
void bar(Number auto t) { std::cout << "This is a Number: " << t << std::endl; }
int main()
{
foo(42); // Number: 42
foo(3.14); // Real Number: 3.14
bar(42); // This is a Number: 42
bar(3.14); // This is a Number: 3.14
}
Re[4]: template (синтаксис) больше не нужен?
Здравствуйте, reversecode, Вы писали:
R>есть еще не помню кейс где SFINAE не будет работать
R>а концепт будет
А у SFINAE другая проблема: у него все перегрузки равноправны и нет способа сделать одну перегрузку "более специальной", чем другая. И иногда резолвить коллизии становится достаточно геморройно. С концептами же можно элегантно выстраивать иерархии типов и предоставлять перегрузки с приоритетами:
http://coliru.stacked-crooked.com/a/068edfc7e85e1e14
R>есть еще не помню кейс где SFINAE не будет работать
R>а концепт будет
А у SFINAE другая проблема: у него все перегрузки равноправны и нет способа сделать одну перегрузку "более специальной", чем другая. И иногда резолвить коллизии становится достаточно геморройно. С концептами же можно элегантно выстраивать иерархии типов и предоставлять перегрузки с приоритетами:
http://coliru.stacked-crooked.com/a/068edfc7e85e1e14
#include <iostream>
#include <type_traits>
#include <concepts>
template <typename T>
concept Number = std::is_arithmetic_v<T>;
template <typename T>
concept RealNumber = Number<T> && std::is_floating_point_v<T>;
void foo(Number auto t) { std::cout << "Number: " << t << std::endl; }
void foo(RealNumber auto t) { std::cout << "Real Number: " << t << std::endl; }
void bar(Number auto t) { std::cout << "This is a Number: " << t << std::endl; }
int main()
{
foo(42); // Number: 42
foo(3.14); // Real Number: 3.14
bar(42); // This is a Number: 42
bar(3.14); // This is a Number: 3.14
}