Есть ли синтаксис для ограничения не шаблонного метода? Все синтаксисы, которые я пробовал на godbolt с понятиями clang: branch и gcc не компилируются:
// these examples do not compile
template <bool B>
struct X
{
requires B
void foo() {}
};
template <class T>
struct Y
{
requires (std::is_trivially_copyable_v<T>)
auto foo() {}
};
Трюк для его компиляции такой же, как и для SFINAE, создайте шаблон методов,хотя они на самом деле не являются шаблонами. И, как ни странно, ограничение, похоже, не нуждается в шаблоне метода, оно может нормально работать только с шаблоном класса, поэтому я действительно надеюсь, что есть способ применить ограничения с концепциями, не прибегая к старым хаки:
// old hacks
template <bool B>
struct X
{
template <bool = B>
requires B
auto foo() {}
};
template <class T>
struct Y
{
template <class = T>
requires std::is_trivially_copyable_v<T>
auto foo() {}
};
Пример из реальной жизни:
template <class T, bool Copyable_buf = false>
struct Buffer
{
/* ... */
requires Copyable_buf
Buffer(const Buffer& other) {}
/* ... */
};
template <class T>
using Copyable_buffer = Buffer<T, true>;