成员变量的类型应该取决于构造函数参数的类型
Type of member variable should depend on constructor argument's type
我尝试定义一个 class 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
是右值或类型 T&
以防万一elem
是左值。
有人知道如何实现吗?
在我们得到 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
。 =21=]
您的 A
模板应该如下所示:
template< typename T >
class A
{
public:
A( T elem )
: _elem( elem )
{}
private:
T _elem;
};
如果您只想允许从工厂方法进行构造,您可以将 make_a
设为好友并将构造函数设为私有。
我尝试定义一个 class 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
是右值或类型 T&
以防万一elem
是左值。
有人知道如何实现吗?
在我们得到 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
。 =21=]
您的 A
模板应该如下所示:
template< typename T >
class A
{
public:
A( T elem )
: _elem( elem )
{}
private:
T _elem;
};
如果您只想允许从工厂方法进行构造,您可以将 make_a
设为好友并将构造函数设为私有。