концепты как параметры шаблонов
От:
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) { /* . . . */ }
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: концепты как параметры шаблонов
Re: концепты как параметры шаблонов
Здравствуйте, rg45, Вы писали:
R>Постояно ловлю себя на мысли, что мне ужасно не хватает этой возможности — передать концепт параметром в какой-нибудь шаблон.
чисто ради интереса — чтож вы такое пишете, что вам может понадобится такое?
Весь мир — Кремль, а люди в нем — агенты
Re[2]: концепты как параметры шаблонов
От:
rg45
Дата: 04.03.24 08:34
Оценка:
+1
Здравствуйте, The Passenger, Вы писали:
R>>Постояно ловлю себя на мысли, что мне ужасно не хватает этой возможности — передать концепт параметром в какой-нибудь шаблон.
TP>чисто ради интереса — чтож вы такое пишете, что вам может понадобится такое?
По-моему, ничего неожиданного в моем желании нет — простое стремление оперировать свойствами типов вместо конкретных типов — собственно то, ради чего и были придуманы концепты. Если, например, я могу одним концептом описать семейство коллекций каких-то контретных типов, то почему бы мне не иметь возможности описывать также коллекции типов, обладающих какими-то определенными свойствами? Это то, что могло бы быть полезным в любой прикладной области.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: концепты как параметры шаблонов
Здравствуйте, 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) {/* . . . */ }
--
Не можешь достичь желаемого — пожелай достигнутого.
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.
Как по мне, эта фича (расширение разновидностей параметров шаблонов) напрашивается самым естественным образом.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: концепты как параметры шаблонов
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
Ну, что ж, лучше поздно, чем никогда. А до тех пор придется выкручиваться обычными метафункциями на шаблонах классов.
--
Не можешь достичь желаемого — пожелай достигнутого.
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;
};
Перекуём баги на фичи!
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить