Более простой метод для получения базового класса - PullRequest
0 голосов
/ 26 сентября 2018

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

template<typename T>
struct Parent {};

struct Child : Parent<int> {};

Я написал следующие шаблонные функции для получения соответствующего указателя Parent:

namespace details {
    template<typename T>
    Parent<T>* make_parent(Parent<T>* param) { return param; }
}

template<typename T>
auto make_parent(T& param) -> decltype(details::make_parent(&param)) { return details::make_parent(&param); }

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

РЕДАКТИРОВАТЬ:

Мое намерение заключается в том, что я могу сделать:

Child foo;
auto bar = make_parent(foo);

(В отличие от более простой версии в другом ответе, где я передаю указатель.)

1 Ответ

0 голосов
/ 26 сентября 2018

Все это может быть упрощено до

template<typename T>
Parent<T>* get_parent_ptr(Parent<T>& param) { return &param; }

Это даст вам указатель на Parent часть чего-либо, полученного из Parent

Если вы хотите иметь возможностьдля обработки const объектов, а также для предотвращения получения указателя на временный объект, к сожалению, вам придется добавить немного больше, добавив

template<typename T>
const Parent<T>* get_parent_ptr(const Parent<T>& param) { return &param; }

template<typename T>
Parent<T>* get_parent_ptr(Parent<T>&& param) = delete; // if you don't care about getting a pointer to a rvalue you can remove this

Все это работает с этим живой пример :

int main()
{
    Child c;
    auto cp = get_parent_ptr(c);
    const Child cc;
    auto ccp = get_parent_ptr(cc);
    //auto error = get_parent_ptr(Child{});
}

Если вы раскомментируете строку error, вы получите сообщение об ошибке, что пытаетесь использовать удаленную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...