Ответ 1
До тех пор, пока мы не получим вывод аргумента шаблона для шаблонов классов, вам нужно использовать для этого вспомогательную функцию:
template <typename T>
auto make_a (T&& elem) {
return A<T>{std::forward<T>(elem)};
}
Это использует ссылку пересылки, чтобы определить, является ли аргумент значением lvalue или rvalue, и конструирует A
, отлично пересылая аргумент. Принимая int
в качестве примера, если lvalue передано, T
будет int&
, и если передается r-значение, T
будет int
.
Ваш шаблон A
должен выглядеть примерно так:
template< typename T >
class A
{
public:
A( T elem )
: _elem( elem )
{}
private:
T _elem;
};
Вы можете сделать make_a
другом и сделать конструктор закрытым, если вы хотите разрешить конструкцию только из метода factory.