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);
------------------------