Помогите мне разобраться в шаблоне вариа - PullRequest
1 голос
/ 30 августа 2011

Вот мой первый код в вариационных шаблонах:

void print_f()
{
}

template<typename T, typename ... ARG>
void print_f(const T& a, ARG... C)
{
    std::cout<<a;
    print_f(C...); // -> at this line I want to know
    std::cout<<std::endl;
}

когда я делаю рекурсивный вызов print_f(C...);, что на самом деле происходит? Я имею в виду Пакет параметров шаблона C распаковывается, и как производится вывод аргумента функции в шаблонах с переменными параметрами, как выполняется сопоставление?

Может кто-нибудь объяснить некоторые основы?

Редактировать: Обычно в шаблонном классе, как

template <typename T> class x{
public:
T aa; // can declare variable of type T
};

но в вариационных шаблонах:

template<typename T, typename ... ARG>
void print_f(const T& a /* , ARG... C -> if remove this */ )
{
    std::cout<<a;
    ARG... C // and put it here , we can't do this,  why?
    print_f(C...); 
    std::cout<<std::endl;
}

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Я думаю, что ваша первая перегрузка printf также должна быть шаблоном, но я не уверен на 100%.

Во всяком случае, это работает более или менее так:

printf("APPLE", 10, '@', 9.0); 
// this calls printf(const char*, int, char, double)
// with T=const char*, and ARG={int, char, double}
    printf(const char* a, ARG ... C) {
    std::cout<<a; // this displays "APPLE"
    print_f(C...); 
    // this calls printf(int, char, double)
    // with T=int, and ARG={char, double}
        printf(int a, ARG ... C) {
        std::cout<<a; // this displays 10
        print_f(C...); 
        // this calls printf(char, double)
        // with T=char, and ARG={double}
            printf(char a, ARG ... C) {
            std::cout<<a; // this displays '@'
            print_f(C...); 
            // this calls printf(double)
            // with T=double, and ARG={}
                printf(double a, ARG ... C) {
                std::cout<<a; // this displays 9.0
                print_f(C...); 
                // this calls printf()
                    printf() {
                    }
                std::cout<<std::endl;
            std::cout<<std::endl;
        std::cout<<std::endl;
    std::cout<<std::endl;

Следует также отметить, что в вашем коде все значения отображаются в одной строке, за которой следует множество пустых строк. Я думаю, что вы хотели endl до рекурсии.

Согласно вашему редактированию: в вашей гипотетической функции template<typename T, typename ... ARG> void print_f(const T& a) вы не сможете вызывать эту функцию, если вы не указали ARG самостоятельно, поскольку ее нельзя определить из типов параметров функции, поскольку ARG больше не присутствует в параметрах.

Кроме того, шаблоны экземпляров не могут быть созданы, поскольку они не являются типом, они представляют собой группу типов. Если вы действительно хотите создать экземпляр чего-либо, вы можете использовать кортеж: std::tuple<ARGS> C;, но все объекты будут созданы по умолчанию, поскольку вы не передали параметры в функцию для построения.

0 голосов
/ 30 августа 2011

и поместите это здесь, мы не можем этого сделать, почему?

Потому что стандарт C ++ 0x не позволяет вам. Он не позволяет распаковывать параметры шаблона в стеке. Или в список данных класса. Или что-нибудь в этом роде.

Позволяет распаковать типы в список параметров, чтобы функция могла принимать переменное число параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...