#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);
}