I try to define a class A
as follows:
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.
};
Here, I want _elem
to have either the type T
in case that the constructor's argument elem
is an r-value or the type T&
in case elem
is an l-value.
Does anyone know how this can be implemented?
Until we get template argument deduction for class templates, you'll need to use a helper function for this:
template <typename T>
auto make_a (T&& elem) {
return A<T>{std::forward<T>(elem)};
}
This uses a forwarding reference to deduce whether the argument is an lvalue or rvalue and constructs the A
by perfectly forwarding the argument. Taking int
as an example, if an lvalue is passed, T
will be int&
, and if an rvalue is passed, T
will be int
.
Your A
template should just look like this:
template< typename T >
class A
{
public:
A( T elem )
: _elem( elem )
{}
private:
T _elem;
};
You could make make_a
a friend and make the constructor private if you only want to allow construction from the factory method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With