Я знаю, что невозможно иметь методы класса, которые были бы одновременно чисто виртуальными и статическими (см. Это обсуждение). Итак, я спрашиваю: есть ли способ гарантировать, что у группы производных классов есть статические ...

1
Taylor 9 Апр 2021 в 00:53

1 ответ

Лучший ответ

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

Вот пример, и у меня есть thunk_nums в базовом классе, зависящем от производного класса, имеющего nums, хотя их можно было бы назвать одинаковыми.

Обратите внимание: если функция не используется, она не будет сгенерирована и, следовательно, не вызовет ошибку. (Что может быть желаемым поведением или, если не желательно, должны быть предприняты шаги, чтобы гарантировать, что оно сгенерировано.)

#include <iostream>

template <typename DERIVED>
class base {
public:
    static constexpr size_t thunk_nums() {
        return DERIVED::nums();
    }
};

template<size_t num>
class derived1 : public base<derived1<num>> {
public:
    static constexpr size_t nums() {return num;}
    derived1() {}
};

template<size_t num>
class derived2 : public base<derived2<num>> {
public:
    static constexpr size_t nums() {return num;}
    derived2() {}
};

int main() {
    std::cout << derived2<20>::thunk_nums() << "\n";
}
1
Eljay 8 Апр 2021 в 22:13