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++

→ Ссылка