C++ Узнать тип данных пакета параметров
Имеется любой класс с пакетом параметров. Внутри часто нужно создать переменную и/или вектор с таким же типом. Как узнать тип Ty_node?
template<class... Ty_node>
const bool sum(Ty_node&&... Nodes) {
_STD vector<Ty_node> V_nodes; // ошибка. Не могу создать вектор
(V_nodes.emplace_back(Nodes), ...);
// ...
}
main(){
//...
int a, b, c;
char d, e;
sum(a, b, c);
sum(d, e);
//...
}
Ответы (2 шт):
Автор решения: dIm0n
→ Ссылка
Различные варианты создания таких векторов:
#include <concepts>
#include <type_traits>
#include <vector>
#include <iostream>
template<typename T, typename... Ts>
requires (... && std::is_same_v<Ts, T>)
void foo(T first, Ts... rest) {
std::vector<T> v{first, rest...};
for (const auto& item : v) {
std::cout << item << '\n';
}
}
#include <initializer_list>
template<typename T>
void bar(std::initializer_list<T> elems) {
std::vector<T> v{std::cbegin(elems), std::cend(elems)};
for (const auto& item : v) {
std::cout << item << '\n';
}
}
#include <cstddef>
#include <tuple>
template<std::size_t i, typename... Ts>
using ith_type = std::tuple_element_t<i, std::tuple<Ts...>>;
template<typename... T>
void baz(T... elems) {
std::vector<ith_type<0, T...>> v{elems...};
for (const auto& item : v) {
std::cout << item << '\n';
}
}
int main() {
foo(1, 2, 3);
foo('x', 'y');
// foo(1, 'x');
// foo();
bar({1, 2, 3});
// bar({1, 'x'});
// bar({});
baz(1, 2, 3);
baz(1, 'x'); // 2 тип приводим к 1
// baz();
}
Самый короткий вариант, предложенный участником @user7860670 в комментариях:
#include <vector>
#include <iostream>
template<typename... T>
void foo(T... elems) {
std::vector v{elems...};
for (const auto& item : v) {
std::cout << item << '\n';
}
}
int main() {
foo(1, 2, 3);
foo('x', 'y');
// foo(1, 'x');
// foo();
}
Автор решения: Anton Mitrochin
→ Ссылка
Подумал, что ответ должен быть в стандартной библиотеке и не ошибся
template<class... Ty_node>
const bool sum(Ty_node&&... Nodes) {
using value_type = std::common_type_t<std::decay_t<_Ty_node>...>;
_STD vector<value_type > V_nodes;
(V_nodes.emplace_back(Nodes), ...);
// ...
}
Также ответ user7860670 оказался рабочим:
template<class... Ty_node>
const bool sum(Ty_node&&... Nodes) {
_STD vector V_nodes = {Nodes...};
}
Мне пригодятся оба решения в разных ситуациях. Всем спасибо!
P.s. Ох уж этот c++