Информация об изменениях

Сообщение 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

#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

#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
}