Я наткнулся на сценарий, и я пытаюсь найти самый чистый подход, если таковой имеется.
У меня есть шаблонный класс с защищенным конструктором, который должен быть создан в другом шаблоне.учебный класс.Оба разделяют часть параметров шаблона, но не все.Вот пример моей проблемы.
Я хотел бы узнать от опытных программистов, есть ли другие возможные решения (я полагаю, нет, кроме как сделать конструктор общедоступным), и если между двумя я представляю одно, его более приемлемо, чемДругой.Спасибо
Решение 1 - Я передаю «ненужные» параметры шаблона классу с защищенным конструктором (класс Element).
template <typename Tp_>
class Engine_Type_X
{
};
template <typename Tp_>
class Engine_Type_Z
{
};
//Forward declaration
template <typename Tp_, template<typename> typename Eng_>
class Container;
//Eng_ is only required to declare the friend class
template <typename Tp_,template<typename> typename Eng_>
class Element
{
friend class Container<Tp_,Eng_>;
Tp_ tp_;
protected:
Element(Tp_ tp) : tp_{tp} //protected ctor!!!
{}
};
template <typename Tp_, template<typename> typename Eng_>
class Container
{
using Element_tp = Element<Tp_,Eng_>;
using Engine_tp = Eng_<Tp_>;
std::vector<Element_tp> container_;
Engine_tp &engine_;
public:
Container(Engine_tp &engine) : container_{},engine_{engine}
{}
void install(Tp_ tp)
{ Element_tp elem{tp};
container_.emplace_back(elem);
}
};
Решение 2 - Iиспользовать подход, подобный тому, который я нашел здесь Как объявить шаблонную структуру / класс своим другом?
template <typename Tp_>
class Engine_Type_X
{
};
template <typename Tp_>
class Engine_Type_Z
{
};
template <typename Tp_>
class Element
{
template<typename,template<typename>typename> friend class Container; //All templated classes are friend
Tp_ tp_;
protected:
Element(Tp_ tp) : tp_{tp} //protected ctor!!!
{}
};
template <typename Tp_, template<typename> typename Eng_>
class Container
{
using Element_tp = Element<Tp_>;
using Engine_tp = Eng_<Tp_>;
std::vector<Element_tp> container_;
Engine_tp &engine_;
public:
Container(Engine_tp &engine) : container_{},engine_{engine}
{}
void install(Tp_ tp)
{ Element_tp elem{tp};
container_.emplace_back(elem);
}
};