Возможно ли расширение пакета шаблонов C ++ variadi c на несколько типов шаблонов (например, std :: shared_ptr)? - PullRequest
0 голосов
/ 11 марта 2020

https://en.cppreference.com/w/cpp/language/parameter_pack

У меня есть функция с такой подписью

    template <typename FirstType, typename ...NextTypes>
    static std::vector<std::tuple<std::shared_ptr<FirstType>, std::shared_ptr<NextTypes...>>>

Когда мое истинное намерение состоит в том, чтобы объявить что-то, что означает это

    template <typename FirstType, typename ...NextTypes>
    static std::vector<std::tuple<std::shared_ptr<FirstType>, std::shared_ptr<NthType>, std::shared_ptr<NthType>>>

Я бы предпочел не передавать типы шаблонов как shared_ptr. Это возможно / как?

1 Ответ

0 голосов
/ 11 марта 2020

Если я правильно понял, вы хотите расширить пакет параметров шаблона на несколько элементов кортежа. Вот как это сделать, например:

template <typename FirstType, typename ...NextTypes>
static std::vector<std::tuple<std::shared_ptr<FirstType>, std::shared_ptr<NextTypes>...>> some_function(FirstType t, NextTypes... n) {
    return { make_tuple(make_shared<FirstType>(t), make_shared<NextTypes>(n)...) };
}

После вызова функции вы получите вектор с кортежем, в котором хранятся три std::shared_ptr указателя:

int main() {
    int* ip = nullptr;
    long* lp = nullptr;
    double* dp = nullptr;

    auto v = some_function(ip, lp, dp);
    auto t = v.front();

    auto sp = get<1>(t);
    if (sp) cout << "Not NULL" << endl;

    return 0;
}
...