ОК, поэтому я готовил ответ здесь , в котором есть больше деталей (и лучшая альтернатива). Но я понял, что сделал пару шаблонных функций, которые имели большую избыточность.Дано:
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(¶m)) { return details::make_parent(¶m); }
Кажется, там много повторений.Но я не могу понять, как сделать его чище.Могу ли я объединить это в одну функцию, чтобы она не выглядела как кошмар?
РЕДАКТИРОВАТЬ:
Мое намерение заключается в том, что я могу сделать:
Child foo;
auto bar = make_parent(foo);
(В отличие от более простой версии в другом ответе, где я передаю указатель.)