Создание функции-оболочки для конструктора, такой как следующие компиляции, просто отлично:
#include <iostream>
template <typename T>
class wrapper
{
public:
template <typename A0>
T* operator () (const A0& a0) const
{
return new T(a0);
}
};
class Foo
{
public:
Foo(int i) { std::cout << "Foo:Foo(" << i << ")" << std::endl; }
};
int main(int argc, char** argv)
{
wrapper<Foo>()(42);
return 0;
}
Но код не компилируется, когда я обновляю строку:
T* operator () (const A0& a0) const
до:
T* operator () (A0& a0) const
Полагаю, это связано с тем, что значение 42 не привязывается к неконстантной ссылке. Но когда я сделаю ссылку const, это будет означать, что я никогда не смогу вызвать конструктор, который фактически принимает неконстантную ссылку. Может кто-нибудь объяснить, что здесь происходит, и что нужно сделать, чтобы это работало?