Russian Qt Forum
Ноябрь 05, 2024, 21:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Variadic макрос с Variadic функцией  (Прочитано 2207 раз)
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) в макросе?
Записан
virtual_root
Гость
« Ответ #1 : Июнь 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*,...);
компилируется но при вызове ошибка...
Подскажите, возможно ли сделать такой указатель?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #2 : Июнь 03, 2013, 13:10 »

У меня что-то не вышло.. Пыталась так:
Код:
void (Test::*pt2Member)(void*,...);
компилируется но при вызове ошибка...
Ёшкин ж кот)

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

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 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);
 
Чего не хватает и зачем лезть в дебри?  Улыбающийся
Записан
virtual_root
Гость
« Ответ #4 : Июнь 03, 2013, 14:34 »

ну мне хотелось свой print написать)) и заодно поэксперементировать)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 03, 2013, 15:40 »

ну мне хотелось свой print написать)) и заодно поэксперементировать)
Вижу на основной работе Вы не очень загружены Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.111 секунд. Запросов: 23.