我尝试按如下方式定义类A
:
template< typename T >
class A
{
public:
A( T elem )
: _elem( elem )
{}
private:
TYPE _elem; // "TYPE" should be either "T" in case "elem" is an r-value or "T&" in case "elem" is an l-value.
};
在这里,我希望_elem
具有类型T
,以防构造函数的参数elem
是r值,或T&
类型elem
1}}是一个l值。
有谁知道如何实施?
答案 0 :(得分:12)
在我们获得template argument deduction for class templates之前,您需要使用辅助函数:
template <typename T>
auto make_a (T&& elem) {
return A<T>{std::forward<T>(elem)};
}
这使用转发引用来推断参数是左值还是右值,并通过完美转发参数来构造A
。以int
为例,如果传递左值,则T
将为int&
,如果传递左值,则T
将为int
。< / p>
您的A
模板应该如下所示:
template< typename T >
class A
{
public:
A( T elem )
: _elem( elem )
{}
private:
T _elem;
};
如果您只想从工厂方法允许构造,可以让make_a
成为朋友并使构造函数成为私有。