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