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. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.