GCC10> Концепты
От: Шахтер Интернет  
Дата: 08.05.20 19:19
Оценка: 13 (2) +1
GCC10 реализует концепты. В предыдущей версии была экспериментальная реализация. Новая хуже старой.
Основные отличия.

------------------------

template <class T>
concept bool SomeConcept = .... ;


bool теперь не нужен. Компилятор, однако, не генерирует ошибку, а даёт предупреждение.

------------------------

template <class T>
concept A = .... ;

template <A T>
concept B = .... ;


Вот так делать теперь нельзя. Нужно так

template <class T>
concept B = A<T> && .... ;


------------------------

template <class T>
concept A = requires(A obj) { { obj.method() } -> int ; } ;


Вот так тоже теперь нельзя. Нужно (да здравствует ЦК КПСС комитет !!! Тренируйте пальчики )

template <class T>
concept A = requires(A obj) { { obj.method() } -> std::convertible_to<int> ; } ;


Ладно бы больше писать.

Раньше можно было делать так.

template <class T>
concept bool Has_keepAlive = requires()
 {
  { &T::keepAlive } -> void (T::*)(ObjectDomain::Keeper) ;
 } ;

class Test
 {
   .... 

  public:

   template <class Keeper>
   void keepAlive(Keeper keeper)
    {
     keeper(ptr,del_ptr,any_ptr);
    }
 };

static_assert( Has_keepAlive<Test> ,"Test : keepAlive is missing");


А вот сейчас фигушки (из-за того, что keepAlive шаблон). Но есть workaround.

template <class T>
concept Has_keepAlive = requires(void (T::*ret)(ObjectDomain::Keeper))
 {
  ret=&T::keepAlive;
 } ;


или

template <class T>
void Ground(T /* arg */) {}

template <class T>
concept Has_keepAlive = requires()
 {
  Ground<void (T::*)(ObjectDomain::Keeper)>( &T::keepAlive );
 } ;


Велик и могуч C++! Даже комитету его трудно испортить!

------------------------

И ещё одно упражнение для пальцев. Теперь нельзя

void func(SomeConcept obj);


Нужно

void func(SomeConcept auto obj);


------------------------
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: GCC10> Концепты
От: rg45 СССР  
Дата: 08.05.20 19:31
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>GCC10 реализует концепты. В предыдущей версии была экспериментальная реализация. Новая хуже старой.

Ш>Основные отличия.

А ты не сверял со стандартом, какая из реализаций ближе к требованиям?

Ш>Вот так делать теперь нельзя. Нужно так


Ш>
Ш>template <class T>
Ш>concept B = A<T> && .... ;
Ш>


В принципе, эта форма полностью покрывает все возможности формы template <A T>. Немного меньше синтаксического сахара, но не критично, имхо.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 08.05.2020 19:45 rg45 . Предыдущая версия .
Re: GCC10> Концепты
От: Vamp Россия  
Дата: 08.05.20 19:51
Оценка: +1 :)
Концепты страдают с самого детства. Их добавляли, потом убирали, теперь снова добавляют... Не выходит каменный концепт.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: GCC10> Концепты
От: Шахтер Интернет  
Дата: 09.05.20 06:52
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Шахтер, Вы писали:


Ш>>GCC10 реализует концепты. В предыдущей версии была экспериментальная реализация. Новая хуже старой.

Ш>>Основные отличия.

R>А ты не сверял со стандартом, какая из реализаций ближе к требованиям?


Текущая вроде бы по стандарту, но я тщательно не проверял. Если верить разработчикам, то дело обстоит вот так.

Ш>>Вот так делать теперь нельзя. Нужно так


Ш>>
Ш>>template <class T>
Ш>>concept B = A<T> && .... ;
Ш>>


R>В принципе, эта форма полностью покрывает все возможности формы template <A T>. Немного меньше синтаксического сахара, но не критично, имхо.


Да, но раньше писать было удобнее и как бы даже нагляднее. Не критично, да.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: GCC10> Концепты
От: Шахтер Интернет  
Дата: 09.05.20 06:55
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Концепты страдают с самого детства. Их добавляли, потом убирали, теперь снова добавляют... Не выходит каменный концепт.


Ну какой же он каменный, он пока light. А настоящие, железобетонные, будут при коммунизме когда-нибудь в светлом будущем.
И вообще, вводить надо медленно. А то у народа от современного С++ голова уже болит.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: GCC10> Концепты
От: rg45 СССР  
Дата: 09.05.20 09:51
Оценка:
Здравствуйте, Шахтер, Вы писали:


Ш>Вот так делать теперь нельзя. Нужно так


Ш>
Ш>template <class T>
Ш>concept B = A<T> && .... ;
Ш>


R>В принципе, эта форма полностью покрывает все возможности формы template <A T>. Немного меньше синтаксического сахара, но не критично, имхо.

Ш>Да, но раньше писать было удобнее и как бы даже нагляднее. Не критично, да.

Зато эта форма позволит использовать не только T, но и образованные от него типы, наподобие:

Ш>
Ш>template <class T>
Ш>concept B = IsDereferenceable<T> && A<DereferencedType<T>> && ...;
Ш>


А раз есть способ сделать и то, и это, то зачем еще рядышком держать какой-то другой способ, покрывающий лишь небольшую часть того, что уже доступно. Ну вот только ради эстетики, разве что.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 09.05.2020 10:02 rg45 . Предыдущая версия .
Re[4]: GCC10> Концепты
От: Шахтер Интернет  
Дата: 10.05.20 05:35
Оценка:
Здравствуйте, rg45, Вы писали:

R>А раз есть способ сделать и то, и это, то зачем еще рядышком держать какой-то другой способ, покрывающий лишь небольшую часть того, что уже доступно. Ну вот только ради эстетики, разве что.


Это очень распространённый случай. Эстетика плюс сокращает запись.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: GCC10> Концепты
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.05.20 05:42
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>И вообще, вводить надо медленно. А то у народа от современного С++ голова уже болит.


Пухнет же
Маньяк Робокряк колесит по городу
Re: GCC10> Концепты
От: _NN_ www.nemerleweb.com
Дата: 11.05.20 06:16
Оценка: 7 (1)
Здравствуйте, Шахтер, Вы писали:

Вдогонку к концептам.

template <typename T>
concept Trivial = std::is_trivial_v<T>;
    
template <typename T, typename U>
  requires Trivial<T>
void fun(T t, U u) { std::cout << "general"; } // 1
 
template <typename T, typename U>
  requires Trivial<T> && Trivial<U>
void fun(T t, U u) { std::cout << "special"; } // 2

fun(1, 2); // Вызывает 2


template <typename T, typename U>
  requires std::is_trivial_v<T>
void fun(T t, U u) { std::cout << "general"; } // 1
 
template <typename T, typename U>
  requires std::is_trivial_v<T> && std::is_trivial_v<U>
void fun(T t, U u) { std::cout << "special"; } // 2

fun(1, 2); // Ошибка компиляции, неоднозначность вызова


https://akrzemi1.wordpress.com/2020/05/07/ordering-by-constraints/
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: GCC10> Концепты
От: rg45 СССР  
Дата: 11.05.20 11:39
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>
_NN>template <typename T, typename U>
_NN>  requires std::is_trivial_v<T>
_NN>void fun(T t, U u) { std::cout << "general"; } // 1
 
_NN>template <typename T, typename U>
_NN>  requires std::is_trivial_v<T> && std::is_trivial_v<U>
_NN>void fun(T t, U u) { std::cout << "special"; } // 2

_NN>fun(1, 2); // Ошибка компиляции, неоднозначность вызова
_NN>


_NN>https://akrzemi1.wordpress.com/2020/05/07/ordering-by-constraints/


Таким образом, логика "more constrained" активизируется только при использовании концептов, я правильно уловил суть?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: GCC10> Концепты
От: _NN_ www.nemerleweb.com
Дата: 11.05.20 11:51
Оценка: 7 (1)
Здравствуйте, rg45, Вы писали:

R>Таким образом, логика "more constrained" активизируется только при использовании концептов, я правильно уловил суть?


Да, тогда только компилятор понимает, что требования связанные и начинает всё просчитывать.
В конце, также, дана рекомендация не использовать дизъюнкцию, чтобы упростить жизнь компилятору и походу себе тоже
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: GCC10> Концепты
От: Erop Россия  
Дата: 21.05.20 20:30
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>И вообще, вводить надо медленно. А то у народа от современного С++ голова уже болит.


Э, нет. Когда голова болит, как медленно не вводи, всё равно ввести получится только через задницу
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: GCC10> Концепты
От: Vamp Россия  
Дата: 21.05.20 20:54
Оценка: :))
E>Э, нет. Когда голова болит, как медленно не вводи, всё равно ввести получится только через задницу

Экспериенс не пропьешь.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.