Как проверить, имеет ли класс функцию защищенного члена?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как проверить, имеет ли класс функцию защищенного члена?

Сообщение Anonymous »

Рассмотрим этот простой кусок кода C ++: < /p>

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

class Foo
{
public:
Foo() = default;
};

int main() {
static_assert(std::is_default_constructible_v);

return 0;
}
< /code>
Foo
имеет публичный конструктор по умолчанию, поэтому STATIC_ASSERT проходит. С другой стороны, если public изменяется на private , foo не может быть по умолчанию, поэтому static_assert не проходит. Пока что хорошо. >, поэтому static_assert снова не проходит. Однако, если бы какой-то план классов должен был унаследовать от foo , foo будет подлежат по умолчанию из-за BAR , но static_assert все равно не будет проходить. Это разумно, но проблематично.
Теперь мой вопрос: возможно ли (и как) построить панель классов , которые наследуют от foo , есть некоторые Важная логика по умолчанию по умолчанию и подходит по умолчанию только в том случае, если она может по умолчанию, создавать foo .
Другими словами, можно сделать так, чтобы можно было сделать так, чтобы Следующий код проходит: < /p>

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

#include 

class Foo
{
protected:
Foo() = default;
};

class Doo
{
protected:
Doo() = delete;
};

template 
struct Bar : public T
{
// some implementation ...
Bar()
// some magical `requires` statement here ...
: T()
{
// some very important logic here!
};
};

int main() {
static_assert(std::is_default_constructible_v);
static_assert(!std::is_default_constructible_v);

return 0;
}

< /code>
[b]NOTE1:[/b] If protected
заменяется public В предыдущем коде, решение было бы простым: конструктор BAR просто должен потребовать T , чтобы соответствовать по умолчанию. Тем не менее, очень важно, чтобы у Foo и doo защищенные конструкторы, поскольку они никогда не должны использоваться самостоятельно.
note2: эта проблема не имеет ничего общего с конструкторами, это может быть связано с любой функцией -членом. Я выбрал конструктор по умолчанию исключительно потому, что существует существующий тип признака std :: is_default_constructible_v .

Подробнее здесь: https://stackoverflow.com/questions/794 ... r-function
Ответить

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

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

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

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

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