Использование 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]

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