Параметры по умолчанию и список переменных

Я играл с переменным списком параметров. Пожалуйста, обратитесь к приведенному ниже фрагменту кода. Здесь я пытаюсь напечатать содержимое определенного пользователем типа внутри Foobar.

template<typename T>
void Foobar(const T& obj,int nNumberofParams,...)
{
va_list args;
va_start(args,nNumberofParams);
for(int i =0 ; i < nNumberofParams; i++)
{
T val = va_arg(args,T);
val.PrintContent();
}
va_end(args);
}
//! Template Specialization for int
template<>
void Foobar(const int& ,int nNumberofParams,...)
{
va_list args;
va_start(args,nNumberofParams);
cout << "Foobar specialize for int called" << endl;
for(int i =0 ; i < nNumberofParams; i++)
{
int val = va_arg(args,int);
cout << val << endl;
}
va_end(args);

}

В основном я делаю что-то вроде этого

int _tmain(int argc, _TCHAR* argv[])
{
//! MyClass implements PrintContent
MyClass obj,obj1(1,2,0),obj2(3,4,1),obj3,obj4(5,5,2),obj5(6,6,3);
Foobar(obj,5,obj1,obj2,obj3,obj4,obj5);// Works fine

//! Can't this be simpler ?
int i = 3;
int &j = i;
Foobar(j,3,1,2,3);// Template specialization for int

//! Can't this be simpler ?
double d = 3.0;
double& d1 = d;
Foobar(d1,3, 1.0,2.0,3.0);// Template specialization for double

return 0;

}

Возможно ли иметь аргумент по умолчанию в функции, которая принимает список переменных? Это да, тогда как это сделать?

1

Решение

В C ++ 11 вы можете использовать переменные шаблоны.

В C ++ 03, почему бы вам не сделать обычный первый параметр правильного типа и включить список переменных параметров из второго параметра вместо того, чтобы вводить «фиктивный» параметр? Или назовите специализацию шаблона как Foobar<int> ?

3

Другие решения

Это возможно в C ++ 11: http://ideone.com/9CGz4

void Foobar() {}

template<typename First, typename... Rest>
void Foobar(const First &val, Rest... args)
{
val.PrintContent();
Foobar(args...);
}

template<typename... Rest>
void Foobar(const int val, Rest... args)
{
std::cout << val << std::endl;
Foobar(args...);
}

Начиная с C ++ 03: http://ideone.com/36lA5

template<typename T>
void Print(T val) {
cout << val << endl;
}

struct MyStruct {
MyStruct(int a) : b(a) {}
void print() { cout << "MS: " << b << endl; }
int b;
};

void Print(MyStruct &val) {
val.print();
}

template<typename T>
void Foobar(int nNumberofParams, ...) {
va_list args;
va_start(args,nNumberofParams);
for(int i =0 ; i < nNumberofParams; i++)
{
T val = va_arg(args,T);
Print(val);
}
va_end(args);
}

а потом просто специализируюсь Print чтобы соответствовать вашим потребностям.

Foobar<MyStruct>(2, MyStruct(1), MyStruct(2));

или даже

Foobar<MyStruct>(2, 1, 2);

Это немного проще.

0