2017-02-20 25 views
0

У меня есть вариационная функция, которая вызывает функцию для каждого аргумента.Есть ли способ передать пустоту в качестве аргумента?

Это то, что он выглядит следующим образом:

void Call() 
{ 

} 

template<typename T> 
void Call(T arg) 
{ 
    PushArg(arg); 
    Call(); 
} 

template<typename T, typename ...Args> 
void Call(T arg, Args... args) 
{ 
    PushArg(arg); 
    Call(std::forward<Args...>(args)...); 
} 

template<typename T> 
void PushArg(T arg) 
{ 

} 

template<> 
void PushArg<int>(int arg) 
{ 

} 

Если я вызываю функцию с Call(2, 2) он будет вызывать PushArg<int>(2) дважды, а затем вызвать Call(). Но мне нужно позвонить по телефону PushArg, но без значения.

То, что я хочу быть в состоянии сделать это сделать Call(2, void, 4) и иметь его называют PushArg<int>(2), PushArg<void>(), затем PushArg<int>(4).

В настоящее время у меня есть класс «null», который существует только для того, чтобы разрешить мне передавать значение без значения, но это делает вызов неудобным. Делает то, что я описал (или что-то подобное), возможно?

+0

Нет, вы не можете сделать C++ 'void' заполнить эту роль. Вам нужно использовать заполнитель. –

+0

Где находится 'arg', используемый в вариационной функции' Call', определен? –

+0

@ Cheersandhth.-Alf Не могли бы вы объяснить, что вы спрашиваете? Мне пришлось в значительной степени изменить исходный код, чтобы сделать его маленьким и читаемым, поэтому возможно, что я случайно опустил что-то важное. – user112513312

ответ

2

Нет, вы не можете передать тип в качестве аргумента функции. Единственное решение, которое я могу представить, это особый тип (ваш «нулевой класс», я полагаю), чтобы заменить void.

Я думаю, что это чистое решение, поэтому я предлагаю пример

#include <utility> 
#include <iostream> 

struct voidWrp 
{ }; 

void PushArg() 
{ std::cout << "- void PushArg" << std::endl; } 

template <typename T> 
void PushArg (T arg) 
{ std::cout << "- generic (T) PushArg" << std::endl; } 

template <> 
void PushArg<int> (int arg) 
{ std::cout << "- int PushArg" << std::endl; } 

void Call() 
{ } 

template <typename T> 
void Call (T arg) 
{ 
    PushArg(arg); 
    Call(); 
} 

template <typename T, typename ... Args> 
void Call (T arg, Args ... args) 
{ 
    PushArg(arg); 
    Call(std::forward<Args>(args)...); 
} 

template <typename ... Args> 
void Call (voidWrp const &, Args ... args) 
{ 
    PushArg(); 
    Call(std::forward<Args>(args)...); 
} 

int main() 
{ 
    Call("std::string value", 3, voidWrp{}, 6, 7L); 
} 

Пример программы принты

- generic (T) PushArg 
- int PushArg 
- void PushArg 
- int PushArg 
- generic (T) PushArg 

 Смежные вопросы

  • Нет связанных вопросов^_^