АК
Size: a a a
АК
ПК
ПК
template <class T> concept HasFoo = requires (T& t) { t.foo(); }
foo()
. Иначе - нет операции. Если я опечатаюсь в сигнатуре или названии, класс не сможет это определить и просто выкинет вызов "неправильной" fooАК
CD
struct I { virtual void foo() { /* nothing */ } };
struct A : I { void foo() final { /* impl */ } };
struct B : I { /* no foo */ };
struct A { void foo() { /* impl */ } };
struct B { /* no foo */ };
A
от B
, проверив статически наличие void foo()
, но есть нюанс - нет аналога final
/override
. То есть, если я ошибусь в сигнатуре функции или опечатаюсь в названии, компилятор меня не поправит. Есть способ решить эту проблему? Я думал в сторону каких-нибудь варнингов, которые будут реагировать на неиспользуемый метод. Компилятор - gcc.NP
template <typename SomeConcept>
void foo(SomeConcept some) {
some.bar();
}
NP
bar
и barDefault
ПК
АК
: I
, а значит и в случае статического интерфейса я должен буду явно это указывать.struct A {
static_assert(implements_foo<A>);
void foo() { };
}
АК
struct A : implements_foo<A> {
void foo() {}
};
CD
: I
, а значит и в случае статического интерфейса я должен буду явно это указывать.struct A {
static_assert(implements_foo<A>);
void foo() { };
}
CD
АК
: I
и final
. Всё, никаких букв лишнихАК
CD
: I
и final
. Всё, никаких букв лишнихCD
CD
ПК
: I
, а значит и в случае статического интерфейса я должен буду явно это указывать.struct A {
static_assert(implements_foo<A>);
void foo() { };
}
АК
struct A : is_foo<A>, named<"A">, ... {};
CD
struct A : is_foo<A>, named<"A">, ... {};