Как связать конструктор в C++?
В одном классе у меня есть класс шаблона с конструктором, как показано ниже:
namespace EMRProcess
{
template<typename T>
class CEMRImpl
{
CEMRImpl(EMRProcessSR::CWebHandler<T>* pHandler_,
CSocketRemover* pSocketRemover, const std::string& strID, const std::string& strNo);
};
}
Из другого класса я пытаюсь связать конструктор, как показано ниже:
m_pMyObj->processEvent(EVT_MED, strTestId,
std::bind(&EMRProcess::CEMRImpl<T>::CEMRImpl,
this,
this,
strID,
strNo));
При компиляции я получаю сообщение об ошибке: отсутствует «имя типа» перед именем зависимого типа «EMRProcess:: CEMRImpl:: CEMRImpl»
Может ли кто-нибудь помочь мне в этом?
@GuillaumeRacicot готово
Вы можете реализовать статическую функцию-член, которая создает экземпляры:
static auto create(
CWebHandler<T>* pHandler,
CSocketRemover* pSocketRemover,
const std::string& strId,
const std::string& strNo)
{
return CEMRImpl<T>(pHandler, pSocketRemover, strId, strNo);
}
Исходя из этого, вы можете использовать bind для создания вызываемого объекта:
static auto createFactory(
CWebHandler<T>* pHandler,
CSocketRemover* pSocketRemover,
const std::string& strId,
const std::string& strNo)
{
return std::bind(create, pHandler, pSocketRemover, strId, strNo);
}
Или вы можете просто использовать лямбду, как упоминал Реми Лебо:
auto task_factory = [] { return EMRProcessSR::CEMRImpl<int>(pHandler, pSocketRemover, "foo", "bar");};
То, что вы пытаетесь сделать с помощью конструктора std:::bind()
, никогда не будет работать как есть, поскольку получение адреса конструктора является незаконным. Но лямбду можно использовать везде, где можно использовать std::bind()
(на самом деле, лямбда почти всегда предпочтительнее std::bind()
), поэтому пусть лямбда обычно вызывает конструктор и возвращает новый объект, например:
m_pMyObj->processEvent(EVT_MED, strTestId,
[&, this](){ return EMRProcess::CEMRImpl<T>(this, this, strID, strNo); }
);
Спасибо @Remy Lebeau за решение.
Помогает ли следующее:
std::bind(&typename EMRProcess::CEMRImpl<T>::CEMRImpl, ...);
?