Переменное число параметров функции по формату
От: PWW  
Дата: 14.03.07 10:44
Оценка:
Пишу функцию с переменным числом параметров котрые можно вводить по формату.
Т.е. должно получиться чтото вроде такого

d.put("%d,%h,%t%,%i%,%i%,%i%","сохранить_1,"Glob","t1","i1","первый","i2","второй","i3","третий");

d.put("%d,%h,%t%,%i%,%i%,%i%","сохранить_2,"Glob","t2","i1","первый");

но в идеале хотелось вот так
d.put("%d,%h,%t%, %i%,%i%,%i%"),"сохранить_1,"Glob","t1",("i1","первый"),("i2","второй"),("i3","третий");

string А="сохранить_1;
string B="Glob";
d.put("%d,%h,%t%, %i%,%i%,%i%"),А, B,"t1",("i1","первый"),("i2","второй"),("i3","третий");

по формату %i% вводится два параметра.

сейчас это выглядит так
foo3(series_builder<int>()<< 1 << 2 << 3, table<int>() << 4 << 5 << 6);

в причесаном виде после препроцессора должно быть так
d.put(%i%<int><< 1 << 2 << 3, %t%<string> << "4" << "5" << "6");

Хочется написать "по современному" ,т.е. c проверка типов на этапе компиляции .

Посмотрел на форуме предложенное Кодт, кое что изменил под себя. В итоге
для int, long работает, а для char, string выдаётся ошибка. Текст полностью ниже. (посмотрел книгу Александреску и библиотеку Loki, не совсем понял как они решили этот вопрос, примеров не нашёл. Есть еще Boost Libraries, но примеров тоже мало, пожее решение есть в QT). И вообще покритикуйте может я
слишком всё усложнил, и вообще это решить не возможно.

#include "vector"
#include "iostream"

using namespace std;



template<class T, class C = std::vector<T> >
class series_builder
{
private:
  mutable C cont_;
public:
  const C& data() const { return cont_; }
  typedef typename C::const_iterator iterator, const_iterator;
  iterator begin() const { return data().begin(); }
  iterator end() const { return data().end(); }
  typename C::size_type size() const { return data().size(); }

  const series_builder& operator<<(const T& v) const // константность - потому что это rvalue->const lvalue
  {
    cont_.push_back(v);
    return *this;
  }
    
};
//
template<class T, class C = std::vector<T> >
class  table
{
private:
  mutable C cont_;
public:
  const C& data() const { return cont_; }
  typedef typename C::const_iterator iterator, const_iterator;
  iterator begin() const { return data().begin(); }
  iterator end() const { return data().end(); }
  typename C::size_type size() const { return data().size(); }

 
  const table& operator<<(const T& v) const // константность - потому что это rvalue->const lvalue
  {
    cont_.push_back(v);
    return *this;
  }
    
  

};
//.....
void foo(const series_builder<int>& series){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i];
}
//template<class T>
void foo2(const table <int>& series){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i];
}
void foo2( table <char>& series){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i];
}
void foo2( table <string>& series){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i];
}
void foo3(const series_builder<int>& series,const table<int>& series2)
{
  for(int i=0; i<series.size(); ++i) cout<<" %1%"<<series.data()[i];
  for(int i=0; i<series2.size(); ++i) cout<<" %2%"<<series2.data()[i];
}
//.....
int main()
{
  foo(series_builder<int>() << 1 << 2 << 3);
  foo2(table<int>() << 1 << 2 << 3);
  //foo2(table<char>() << "1" << "2" << "3"); // Ошибка
  //foo2(table<std::strting>() << "1" << "2" << "3"); // Ошибка
  
  foo3(series_builder<int>()<< 1 << 2 << 3, table<int>()  << 4 << 5 << 6);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.