Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Июнь 03, 2013, 10:18



Название: Variadic макрос с Variadic функцией
Отправлено: virtual_root от Июнь 03, 2013, 10:18
Добрый день. У меня никак не получается справиться с Variadic макросом. Привожу свой код:
Код:
#include <iostream>

class Test
{
    public:
        template<typename T>
        static void print(T arg)
        {
            std::cout<<arg;
        }

        template<typename... T, typename curT>
        static void print(curT curArg, T... args)
        {
            std::cout<<curArg<<std::endl;
            print(args...);
        }
};
#define _print(arg1,...) (Test::print(arg1))

int main(int argc, char* argv[])
{
    Test::print(1.2,"sdfsdf",3,4);
    _print(1.2,"sdfsdf",3,4);
    return 0;
}
я хочу чтобы с помощью моего макроса можно было работать с шаблонной функцией из
класса Test. Но мой макрос выводит только первое значение...
Если я делаю так
Код:
#define _print(arg1,...) (Test::print(arg1,...))

или так
Код:
#define _print(arg1,...) (Test::print(arg1...))
не компилируется вообще..
Ребята, подскажите пожалуйста ка мне добиться вызова функции static void print(curT curArg, T... args) в макросе?


Название: Re: Variadic макрос с Variadic функцией
Отправлено: virtual_root от Июнь 03, 2013, 10:27
вот так сработало!
Код:
#define _print(...) (Test::print(__VA_ARGS__))
ну вопрос собственно, а есть ли другие способы?
И ещё вопрос можно ли сделать указатель на шаблонный метод класса? В моем примере на
этот метод
Код:
template<typename... T, typename curT>
        static void print(curT curArg, T... args)
У меня что-то не вышло.. Пыталась так:
Код:
void (Test::*pt2Member)(void*,...);
компилируется но при вызове ошибка...
Подскажите, возможно ли сделать такой указатель?


Название: Re: Variadic макрос с Variadic функцией
Отправлено: m_ax от Июнь 03, 2013, 13:10
У меня что-то не вышло.. Пыталась так:
Код:
void (Test::*pt2Member)(void*,...);
компилируется но при вызове ошибка...
Ёшкин ж кот)

Подскажите, возможно ли сделать такой указатель?
Возможно.. например, с помощью std::function

А зачем, кстати? И зачем этот ненужный макрос?


Название: Re: Variadic макрос с Variadic функцией
Отправлено: Igors от Июнь 03, 2013, 13:36
Код:
    Test::print(1.2,"sdfsdf",3,4);
    _print(1.2,"sdfsdf",3,4);
}
Лучше избегать таких монструозных конструкций. Насколько я понял, макрос нужен для печати. Тогда простенько
Код
C++ (Qt)
#if DEBUG_PRINT
#define PRINT printf  // нужна печать
#else
#define PRINT   // не нужна
#endif
 
// использование
PRINT("%f, %s, %d, %d", 1.2, "sdfsdf", 3, 4);
 
Чего не хватает и зачем лезть в дебри?  :)


Название: Re: Variadic макрос с Variadic функцией
Отправлено: virtual_root от Июнь 03, 2013, 14:34
ну мне хотелось свой print написать)) и заодно поэксперементировать)


Название: Re: Variadic макрос с Variadic функцией
Отправлено: Igors от Июнь 03, 2013, 15:40
ну мне хотелось свой print написать)) и заодно поэксперементировать)
Вижу на основной работе Вы не очень загружены :)