Использование Enable_if в виртуальных функцияхC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование Enable_if в виртуальных функциях

Сообщение Anonymous »

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

#include 

class Base {
public:
virtual bool f() {
return true;
}
};

template
class Derived : public Base {
std::enable_if_t< std::is_copy_constructible::value, bool > f() override {
return true;
}

std::enable_if_t< !std::is_copy_constructible::value, bool > f() override {
return false;
}
};
Приведенный выше код не компилируется. По какой-то причине, которую мне не удалось понять, компилятор рассматривает две функции как одну и ту же перегрузку, прежде чем удалить одну с помощью SFINAE.

Однако я не понимаю, как мне решить эту проблему. В документах, которые я нашел, говорится, что мне следует использовать шаблоны для этой функции. Однако это не работает, поскольку функция задумана как виртуальная.

Я попытался разгрузить проблему, вызвав невиртуальную функцию, но мне также не удалось ее скомпилировать:

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

template
class Derived : public Base {
virtual bool f() override {
return f_impl();
}

private:
template< std::enable_if_t< std::is_copy_constructible::value > = 0 >
bool f_impl() {
return true;
}

template< std::enable_if_t< !std::is_copy_constructible::value > >
bool f_impl() {
return false;
}
};

int main() {
Derived a;

std::cout

Подробнее здесь: [url]https://stackoverflow.com/questions/57345414/using-enable-if-on-virtual-functions[/url]
Ответить

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

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

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

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

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