C 17 Как векторный класс выводит тип из пакета параметров?

#c #templates #types #constructor #variadic

#c #шаблоны #типы #конструктор #переменный

Вопрос:

я хотел бы вывести тип класса из пакета параметров, переданного конструктору (предполагая, что все значения в пакете параметров имеют один и тот же тип), возможно ли это?

 template<class T>
class SomeClass {
public:
   template<typename... Args>
   SomeClass(Args... args)
   {}

    std::vector<T> value;
}

int main() {
    SomeClass someClass(10, 40, 50, 60) // T would be int
}
 

Как я могу вывести T из аргументов???

Ответ №1:

Вы могли бы предоставить пользовательское руководство по дедукции (C 17), что-то вроде:

 template <typename... Ts>
SomeClass(Ts...) -> SomeClass<std::common_type_t<Ts...>>;
 

ДЕМОНСТРАЦИЯ

Ответ №2:

В соответствии с тем, что у вас есть, вы не можете, поскольку вектор является членом, а члены могут основываться только на параметрах заключающего типа.

Однако вы могли бы сделать вектор членом какого-либо другого типа (включая тип, содержащийся в SomeClass ), а затем выполнить действительно некрасивую работу со стиранием типа (только для иллюстрации, я не пробовал добавлять это к тому, что у вас есть, и заставлять его компилироваться). И обратите внимание, что весь следующий код будет находиться внутри SomeClass:

 struct base
{
 

virtual ~base() {}
виртуальный тип и get_item(size_t index) = 0;
};

структура шаблона impl: база
{
std::векторные значения.

   Type amp; get_item(sze_t index)
  {
    return values[index];
  };
};

std::unique_ptr<base> holder;

template<typename ... Types>
SomeClass(Types ... t)
  : base{std::make_unique<impl<std::common_type_t<Types...>>>(std::forward<Types>(t))}
{
}
}

Type amp; get_item(size_t index)
{
  return holder->get_item(index);
}