Шаблонное вычитание метода Base, вызываемого производным объектом - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь вычесть шаблон функции на основе класса объекта, вызывающего функцию. Как я могу это сделать?

#include <type_traits>
struct B;

template<typename T>
bool f(const T*) { return std::is_same<T, B>::value; }

struct A {
    bool g() { return f(this); }
};
struct B:A {};

int main() {
        B b_obj;
        return b_obj.g(); // returns false
}

Создание виртуального g тоже не помогает. Как я могу заставить b_obj.g() вернуть true?

1 Ответ

2 голосов
/ 08 октября 2019

Оба приведенных ниже способа требуют модификации кода:

Полиморфизм времени выполнения (предпочтительно IMO)

Сделать вызываемую функцию не шаблонным virtual методом базового класса. т.е.

struct A {
  virtual bool f () { /* code */ }
  bool g() { return f(); } // no argument to be passed now!
};    
struct B : A { bool f () override { /* code */ } };

Статический полиморфизм (с использованием CRTP )

template<class Child>
struct A {
  bool g() { return f(static_cast<Child*>(this); }
};
struct B : A<B> {};
...