несколько параметров шаблона в определении концепции - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть концепция с несколькими параметрами шаблона

template<typename T, typename U> EqualityComparable

Можно ли как-то использовать это в

template< EqualityComparable T /* and U */ > void foo() {}

?

В качестве примера рассмотрим этот фрагмент

template <typename T, typename U>
concept EqualityComparable = requires(T a, U b) {
        {a == b} -> bool;
        {a != b} -> bool;
};

template<EqualityComparable T /* and U */>
void foo (T,U) {} //can i make this work?

int main () {
    foo(1.0f,1);
}

Компилятор экспериментальных концепций clang на godbolt говорит мне

template<EqualityComparable T /* and U */> void foo(T,U) {}

--> error: concept 'EqualityComparable' requires more than 1 template argument; provide the remaining arguments explicitly to use it here

, так что, похоже, это возможно?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я думаю, что это должно работать:

template<class T>
void foo_works(T, EqualityComparable<T> auto);

или эквивалентно:

template<class T, EqualityComparable<T> U>
void foo_works(T,U);

Это будет иметь желаемый эффект, но, как написано, оно не отражает симметриюКонцепция EqualityComparable.

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

template<class T,class U>
   requires EqualityComparable<T,U>
void foo_works(T,U);

С концепцией TS есть такая возможность:

EqualityComparable{T,U}
void foo_works(T,U);

Но этот синтаксис напугал консерваторов.

0 голосов
/ 08 февраля 2019

Это возможность

template<typename A, typename B> requires EqualityComparable<T,U>
void foo_works(T,U) {}

, но мне интересно, работает ли она непосредственно в template<>

...