1

Тема: Як мені перевизначити в підкласі таку віртуальну функцію?

Як мені перевизначити в підкласі таку віртуальну функцію? І чи такі віртуальні функції можуть бути взагалі?

template <class T>
class I
{
public:
    virtual auto write(const T&) -> std::enable_if<std::is_copy_constructible<T>::value> = 0;
};
ukrainian.stackexchange.com - це питання-відповіді з української мови
Подякували: leofun011

2

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

virtual auto write(const T&) -> typename std::enable_if<std::is_copy_constructible<T>::value>::type=0;

http://ideone.com/Is5lXP

Подякували: Yola, leofun01, ostap34PHP3

3

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

Так наче працює

template <class T>
class I
{
public:
    virtual auto write(const T&) -> std::enable_if<std::is_copy_constructible<T>::value> = 0;
};

class II : public I<int>
{
public:
    auto write(const int&) -> std::enable_if<std::is_copy_constructible<int>::value> override {
        cout  << __PRETTY_FUNCTION__ << endl;
    };
};
Console написав:

virtual std::enable_if<true, void> II::write(int&)

Питання, чому не можна так:

class II : public I<int>
{
public:
    void write(const int&) override {};
};
ukrainian.stackexchange.com - це питання-відповіді з української мови

4 Востаннє редагувалося Yola (28.07.2017 11:06:28)

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

Зрозуміло, треба ::type пистаи наприкінці :)


Та, ні!

template <class T>
class I
{
public:
    virtual auto write(const T&) -> std::enable_if<std::is_copy_constructible<T>::value>::type = 0;
};

error: expected type-specifier

ukrainian.stackexchange.com - це питання-відповіді з української мови

5 Востаннє редагувалося koala (28.07.2017 11:09:33)

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

Yola написав:

Питання, чому не можна так:

Тому що std::enable_if<true, void> - це приблизно struct{typedef void type;}, а не void.

Подякували: leofun011

6

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

Yola написав:

Та, ні!

typename же.

Подякували: Yola1

7

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

Дякую, старатимусь хоч іноді писати код:)

ukrainian.stackexchange.com - це питання-відповіді з української мови

8

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

Може ще так

virtual auto write(const T&) -> enable_if_t<std::is_copy_constructible<T>::value> = 0;
Maybe a = Just a | Nothing
Подякували: Yola1

9

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

Так, але все це марно, бо як виявилось за допомогою SFINAE видалити функцію з класу неможливо.

ukrainian.stackexchange.com - це питання-відповіді з української мови

10

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

Ви можете сказати, що хочете зробити? Бо у вас є якийсь кінцевий пункт, але нам ви про нього не кажете, то ми й підказати ніц не можемо.

Подякували: leofun011

11

Re: Як мені перевизначити в підкласі таку віртуальну функцію?

А чого б не скористатися static_assert:

template <typename T>
struct A
{
    virtual auto foo() -> T
    {
        static_assert(std::is_copy_constructible_v<T>, "T must be copy constructible");

        return T();
    }
};

int main()
{
    A<int> a;
    a.foo();

    A<std::unique_ptr<int>> a2;
    a2.foo();
}