Как в C++ использовать концепции с композицией (а не наследование в стиле CRTP) для обеспечения соблюдения интерфейса?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как в C++ использовать концепции с композицией (а не наследование в стиле CRTP) для обеспечения соблюдения интерфейса?

Сообщение Anonymous »

Я пытаюсь использовать концепцию C++20 для реализации интерфейса.
Я использую шаблонный класс «A», который вызывает класс «B».
Фокус в том, что вместо этого использования CRTP (наследование). Я использую владение (композицию).
Он работает БЕЗ КОНЦЕПТОВ, но не работает С КОНЦЕПЦИЯМИ.
Вот код для иллюстрации:

Код: Выделить всё

#include 

// =========================================================================

// This is the interface I'm trying to enforce
template
concept HasBar = requires(T t, int x)
{
{ t.bar(x) } -> std::same_as;
};

template // If you change "HasBar" to "typename" it compiles
struct A
{
A(Downstream& downstream) :
downstream_{downstream}
{}

int foo(int x) { return downstream_.bar(x); }

private:
Downstream& downstream_;
};

// =========================================================================

// Not using CRTP
struct B
{
using Upstream = A;
int bar(int x) { return x + 1; }

Upstream upstream_{*this}; // Instead we own the parent
};

// =========================================================================

int main()
{
B b;

return b.upstream_.foo(1);
}
(Godbolt: https://godbolt.org/z/xE3G5nM5n)
Сообщения об ошибках (которые я пытался устранить, поэтому отображается только соответствующая информация):
  • ошибка: ограничения не удовлетворены для шаблона класса «A» [with Downstream = B]
    используя Upstream = A;
  • примечание: поскольку «B» не соответствует шаблону «HasBar»

    />
    примечание: поскольку 't.bar(x)' будет недействительным: доступ участника к неполному типу 'B'
Значит, мы не можем использовать концепции с шаблонными шаблонами композиции, подобными этому, потому что концепту требуется полная информация о типе в момент использования?
ПРИМЕЧАНИЕ. Я видел это: можно ли использовать концепции с идиомой CRTP?
Это означает, что я мог изменить код на следующую, менее красивую форму:

Код: Выделить всё

#include 

// =========================================================================

// This is the interface I'm trying to enforce
template
concept HasBar = requires(T t, int x)
{
{ t.bar(x) } -> std::same_as;
};

template // Back to "typename"
struct A
{
A(Downstream& downstream) :
downstream_{downstream}
{
static_assert(HasBar); // Aha!
}

int foo(int x) { return downstream_.bar(x); }

private:
Downstream& downstream_;
};

// =========================================================================

// Not using CRTP
struct B
{
using Upstream = A;
int bar(int x) { return x + 1; }

Upstream upstream_{*this}; // Instead we own the parent
};

// =========================================================================

int main()
{
B b;

return b.upstream_.foo(1);
}
Возможно, я только что ответил на свой вопрос, но является ли это «правильным» способом сделать это?
Есть ли какие-либо недостатки в использовании static_assert() вместо указания ограничение в шаблоне?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/784 ... tance-to-e
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • C++20: концепции и CRTP
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Использование Archunit для обеспечения соблюдения всех подпакетов, ссылающихся только на «общий» пакет.
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Использование Archunit для обеспечения соблюдения всех подпакетов, ссылающихся только на «общий» пакет.
    Anonymous » » в форуме JAVA
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Является ли Directory to SubDirectory скорее композицией или наследованием?
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Является ли Directory to SubDirectory скорее композицией или наследованием?
    Anonymous » » в форуме C++
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»