концепты как параметры шаблонов
От: rg45 СССР  
Дата: 03.03.24 22:38
Оценка: :)
Постояно ловлю себя на мысли, что мне ужасно не хватает этой возможности — передать концепт параметром в какой-нибудь шаблон.

А прикиньте, как было бы классно:

template <typename T, template <typename> concept C>
concept RangeOf = std::ranges::range<T> && C<std::ranges::range_value_t<T>>;

void foo(RangeOf<std::convertible_to<double>> auto&& r) { /* . . . */ }
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 03.03.2024 22:54 rg45 . Предыдущая версия . Еще …
Отредактировано 03.03.2024 22:41 rg45 . Предыдущая версия .
Re: концепты как параметры шаблонов
От: reversecode google
Дата: 04.03.24 00:28
Оценка: 8 (1)
кажется не вижу разницы с примером в статье
https://brevzin.github.io/c++/2019/01/09/concept-templates/

хотя тут вообще какую то дичь рассматривают
https://stackoverflow.com/questions/63098070/is-it-possible-to-pass-a-concept-as-a-template-parameter
Re: концепты как параметры шаблонов
От: The Passenger Голландия  
Дата: 04.03.24 06:40
Оценка:
Здравствуйте, rg45, Вы писали:

R>Постояно ловлю себя на мысли, что мне ужасно не хватает этой возможности — передать концепт параметром в какой-нибудь шаблон.


чисто ради интереса — чтож вы такое пишете, что вам может понадобится такое?
Весь мир — Кремль, а люди в нем — агенты
Re[2]: концепты как параметры шаблонов
От: rg45 СССР  
Дата: 04.03.24 08:34
Оценка: +1
Здравствуйте, The Passenger, Вы писали:

R>>Постояно ловлю себя на мысли, что мне ужасно не хватает этой возможности — передать концепт параметром в какой-нибудь шаблон.


TP>чисто ради интереса — чтож вы такое пишете, что вам может понадобится такое?


По-моему, ничего неожиданного в моем желании нет — простое стремление оперировать свойствами типов вместо конкретных типов — собственно то, ради чего и были придуманы концепты. Если, например, я могу одним концептом описать семейство коллекций каких-то контретных типов, то почему бы мне не иметь возможности описывать также коллекции типов, обладающих какими-то определенными свойствами? Это то, что могло бы быть полезным в любой прикладной области.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: концепты как параметры шаблонов
От: rg45 СССР  
Дата: 04.03.24 08:48
Оценка: 2 (1)
Здравствуйте, The Passenger, Вы писали:

TP>чисто ради интереса — чтож вы такое пишете, что вам может понадобится такое?


Да чего далеко ходить, вот тебе же понадобилось
Автор: The Passenger
Дата: 01.02 18:20
определить принадлежность типа к std::optional арифметического типа. Ну так вот это могло бы выглядеть примерно так:

template <typename T>
concept arithmetic = std::integral<T> || std::floating_point<T>;

template <typename T, template <typename> concept C>
concept optional_of = instance_of<T, std::optional> && C<optional_underlying_t<T>>;

void do_something(optional_of<arithmetic> auto&& opt_num) {/* . . . */}
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 04.03.2024 9:10 rg45 . Предыдущая версия .
Re[2]: концепты как параметры шаблонов
От: rg45 СССР  
Дата: 04.03.24 10:28
Оценка:
Здравствуйте, reversecode, Вы писали:

R>кажется не вижу разницы с примером в статье

R>https://brevzin.github.io/c++/2019/01/09/concept-templates/

Вот эти слова вселяют надежду:

This won’t be in C++20, but might be something we want to consider for C++23.


Как по мне, эта фича (расширение разновидностей параметров шаблонов) напрашивается самым естественным образом.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 04.03.2024 10:30 rg45 . Предыдущая версия .
Re[3]: концепты как параметры шаблонов
От: reversecode google
Дата: 04.03.24 10:42
Оценка: +1
c++23 похоже пролетел, если в прошлом году только рассматривали
теперь на с++26
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2841r0.pdf
и там еще что то похожее вроде есть в предложениях
но лень линки тянуть
так что как минимум с++26
Re[2]: концепты как параметры шаблонов
От: rg45 СССР  
Дата: 04.03.24 10:52
Оценка:
Здравствуйте, reversecode, Вы писали:

R>кажется не вижу разницы с примером в статье

R>https://brevzin.github.io/c++/2019/01/09/concept-templates/

А вот в статье Concept template parameters 2 есть пример, который действительно очень здорово перекликается с моим
Автор: rg45
Дата: 04.03 01:38
. Даже название концепта совпало:

template <typename R, template <typename> concept C>
concept RangeOf = Range<R> && C<range_value_type_t<R>>;

int some_algo_ints(RangeOf<Same<int>> auto&&);
Numeric auto some_algo(RangeOf<Numeric>> auto&&);

template <typename T>
struct my_vector {
    my_vector(RangeOf<ConvertibleTo<T>> auto&&);
};


Для меня это хорошее подкрепление в том, что мысль действительно здравая.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: концепты как параметры шаблонов
От: rg45 СССР  
Дата: 04.03.24 10:53
Оценка:
Здравствуйте, reversecode, Вы писали:

R>c++23 похоже пролетел, если в прошлом году только рассматривали

R>теперь на с++26

Ну, что ж, лучше поздно, чем никогда. А до тех пор придется выкручиваться обычными метафункциями на шаблонах классов.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 04.03.2024 10:54 rg45 . Предыдущая версия .
Re: концепты как параметры шаблонов
От: rg45 СССР  
Дата: 04.03.24 11:30
Оценка:
R>Постояно ловлю себя на мысли, что мне ужасно не хватает этой возможности — передать концепт параметром в какой-нибудь шаблон.

Пока можно выкручиваться, используя вместо концептров обычные шаблоны классов:

http://coliru.stacked-crooked.com/a/9df3d2f39b7b2315

#include <algorithm>
#include <iostream>
#include <numeric>
#include <ranges>
#include <vector>
#include <type_traits>

template <typename T, template <typename, typename...> class C, typename...X>
concept RangeOf = std::ranges::range<T> && C<std::ranges::range_value_t<T>, X...>::value;

auto accumulate(const RangeOf<std::is_arithmetic> auto& range)
{
   using Value = std::ranges::range_value_t<decltype(range)>;
   return std::accumulate(std::begin(range), std::end(range), Value{});
}

int main()
{
   std::cout << accumulate(std::vector{1, 2, 3, 4, 5}) << std::endl;
}


Но с концептами все могло бы быть на ступеньку выше.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: концепты как параметры шаблонов
От: Кодт Россия  
Дата: 05.03.24 17:02
Оценка: +2
Здравствуйте, rg45, Вы писали:

R>Постояно ловлю себя на мысли, что мне ужасно не хватает этой возможности — передать концепт параметром в какой-нибудь шаблон.


И даже просто передать шаблонный параметр-значение (потому что концепты, по большому счёту, это шаблоны булевых констант).

template<class T, bool B, template<typename> class TT, template<typename> bool TB /* фигушки */>
void f() {}


так что — только в обёртку из класса
struct ConcreteTraits {
  template<class T> static constexpr bool TB = smth;
};

template<class T>
struct TemplateTraits {
  static constexpr bool B = smth;
};
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.