Использование пакета параметров в качестве имени типа для шаблонного класса - PullRequest
1 голос
/ 20 октября 2019

Допустимо ли это: https://godbolt.org/z/_i9dwf

#include <typeinfo>
#include <iostream>

template<typename T>
struct Container
{
};

void fn()
{
    return;
}

template<typename T, typename...type_pack>
void fn(const Container<T>& head, const Container<type_pack>&... args)
{
    std::cout << "I am an " << typeid(T).name() << "\n";
    fn(args...);
    return;
}

int main()
{
    fn(Container<int>{}, Container<float>{});
    return 0;
}

Разрешает ли C ++ такие расширения или эта реализация определяется на основе компилятора? Я не верю, что видел такой синтаксис, используемый в других местах: Container<type_pack>&.... Это просто то, что я придумал для того, чего я хотел достичь, и на удивление это работает. Итак, мой вопрос: это UB, или в стандарте есть фактическое упоминание, что оно четко определено?

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Вы указываете переменное число аргументов типа Container, с типами, которые будут использоваться для выведения type_pack. Например, если вы позвоните:

fn(Container<int>{}, Container<float>{});

type_pack будет представлять тип float. Однако, если вы позвоните:

fn(Container<int>{}, Container<float>{}, Container<int>{}, Container<std::string>{});

type_pack будет представлять пакет параметров float, int, std::string.

Это поведение хорошо определено стандартом.

2 голосов
/ 20 октября 2019

Почему бы и нет?

В вашем коде type_pack

template<typename T, typename...type_pack>
void fn(const Container<T>& head, const Container<type_pack>&... args)

находится в выведенном контексте, поэтому компилятор может вывести float, для type_pack..., из

fn(Container<int>{}, Container<float>{});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...