Подтвердить что ты не робот

Тип переменной-члена должен зависеть от типа аргумента конструктора

Я пытаюсь определить класс 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 является l-значением.

Кто-нибудь знает, как это можно реализовать?

4b9b3361

Ответ 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.