Переменное число параметров функции по формату
От: 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);
}
Re: Переменное число параметров функции по формату
От: Аноним  
Дата: 14.03.07 11:27
Оценка:
А если грязно своровать boost::format?
Re[2]: Переменное число параметров функции по формату
От: PWW  
Дата: 14.03.07 11:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А если грязно своровать boost::format?


похоже не совсем подходит так как %i% принимает два параметра, другие могет принимать больше.
Re: Переменное число параметров функции по формату
От: dr.Chaos Россия Украшения HandMade
Дата: 14.03.07 12:18
Оценка:
Здравствуйте, PWW, Вы писали:


PWW>Посмотрел на форуме предложенное Кодт, кое что изменил под себя. В итоге


PWW>
PWW>#include "vector"
PWW>#include "iostream"

PWW>using namespace std;



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

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

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

PWW>};
PWW>


Со строками должно помочь выделенное. Для символов, нужно по идее любо константы символьные передавать, либо специализировать. Можно вместо static_cast свою функцию преобразования поставить и специализировать ее для преобразования const char* в char.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[2]: Переменное число параметров функции по формату
От: Аноним  
Дата: 15.03.07 06:53
Оценка:
Здравствуйте, dr.Chaos,

DC>Со строками должно помочь выделенное. Для символов, нужно по идее любо константы символьные передавать, либо специализировать. Можно вместо static_cast свою функцию преобразования поставить и специализировать ее для преобразования const char* в char.



Не помогло, ошибка компиляции
Re[3]: Переменное число параметров функции по формату
От: dr.Chaos Россия Украшения HandMade
Дата: 15.03.07 09:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dr.Chaos,


DC>>Со строками должно помочь выделенное. Для символов, нужно по идее любо константы символьные передавать, либо специализировать. Можно вместо static_cast свою функцию преобразования поставить и специализировать ее для преобразования const char* в char.



А>Не помогло, ошибка компиляции


Ты хоть код приведи что ли и ошибку, а то я на семинар по телепатии еще не ходил.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[4]: Переменное число параметров функции по формату
От: Аноним  
Дата: 15.03.07 10:04
Оценка:
Здравствуйте, dr.Chaos,



DC>Ты хоть код приведи что ли и ошибку, а то я на семинар по телепатии еще не ходил.

Format_1.cpp(93): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const char [2]' (or there is no acceptable conversion)
Format_1.cpp(58): warning C4018: '<' : signed/unsigned mismatch
....


Короче не может преобразовать char[2] в char похоже что тащит широкий символ в обычный — неясно зачем и почему. Зато со string все ОК и так

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


и так

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



Привожу результаты труда ниже.

Хочется ещё и тактго (препроцессором интересно можно)
foo(table%i, table%l, table%s)( 1 , 2, 3),(4, 5, 6),( a, b,c);
ну или
foo(table%i, table%l, table%s)( 1 , 2, 3)(4, 5, 6)( a, b,c);

Итоговая программа

int main()
{
  foo(series_builder<int>() << 1 << 2 << 3);
  foo(table<long>() << 4 << 5 << 6);
  foo(table<string>() << "6" << "77" << "88"); 
  foo(table<char>() << "6" << "7" << "8"); 
  foo(table<int>()<< 1 << 2 << 3, table<long>()  << 4 << 5 << 6, table<string>() << "6" << "77" << "88");
  string  a=("99"),  b="111", c="222";
  foo(table<int>()<< 1 << 2 << 3, table<long>()  << 4 << 5 << 6, table<string>() << a << b <<c);
// после препроцессора
  foo(table_int << 1 << 2 << 3, table_long << 4 << 5 << 6, table_string << a << b <<c);
//Мечта
  //foo(table%i, table%l, table%s)( 1 , 2, 3),(4, 5, 6),( a, b,c);
//ну или
  //foo(table%i, table%l, table%s)( 1 , 2, 3)(4, 5, 6)( a, b,c);
}


результат

1 2 3
4
5 6
6
77
88
1
2 3 4 5 6 6 77 88
1
2 3 4 5 6 99 111 222
1
2 3 4 5 6 99 111 222

Код полностью

#include "vector"
#include "iostream"

using namespace std;

#define table_int table<int>()
#define table_long table<long>()
#define table_string table<string>()

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(); }
//dr.Chaos
  /* template<typename Y>
  const table& operator<<(const Y& v) const // константность - потому что это rvalue->const lvalue
  {    
      cont_.push_back(static_cast<T>(v));
    return *this;
  }*/
 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]<<" "; cout<<endl;
}
void foo(const table <int>& series){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i]<<" "; cout<<endl;
}
void foo(const table <long>& series){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i]<<" "; cout<<endl;
}
void foo(const table <char>& series){
  for(int i=0; i<series.size(); ++i) 
      cout<<series.data()[i]<<" "; 
  cout<<endl;
}
void foo(const table <string>& series){
  string  a;
  for(int i=0; i<series.size(); ++i) {
    a=series.data()[i];
    cout<<a.data ( )<<" "; cout<<endl;
  }
}
void foo(const table <int>& series,const table <long>& series2,const table <string>& series3/**/){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i]<<" ";
  for(int i=0; i<series2.size(); ++i) cout<<series2.data()[i]<<" ";
  string  a;
  for(int i=0; i<series3.size(); ++i) {
    a=series3.data()[i];
    cout<<a.data ( )<<" "; 
  }cout<<endl;
}

int main()
{
  foo(series_builder<int>() << 1 << 2 << 3);
  foo(table<long>() << 4 << 5 << 6);
  foo(table<string>() << "6" << "77" << "88"); 
  //foo(table<char>() << "6" << "7" << "8"); 
  foo(table<int>()<< 1 << 2 << 3, table<long>()  << 4 << 5 << 6, table<string>() << "6" << "77" << "88");
  string  a=("99"),  b="111", c="222";
  foo(table<int>()<< 1 << 2 << 3, table<long>()  << 4 << 5 << 6, table<string>() << a << b <<c);
// после препроцессора
  foo(table_int << 1 << 2 << 3, table_long << 4 << 5 << 6, table_string << a << b <<c);
//Мечта
  //foo(table%i, table%l, table%s)( 1 , 2, 3),(4, 5, 6),( a, b,c);
//ну или
  //foo(table%i, table%l, table%s)( 1 , 2, 3)(4, 5, 6)( a, b,c);
}
Re[4]: Переменное число параметров функции по формату
От: Аноним  
Дата: 15.03.07 10:21
Оценка:
Здравствуйте, dr.Chaos

ЗЗЗ!!!

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


на вызов foo(table<char>() << "6" << "77" << "87");

Ошибка в строке const table& operator<<(const Y& v) const

Format_1.cpp(46): error C2440: 'static_cast' : cannot convert from 'const char [2]' to 'char'
Format_1.cpp(46): error C2440: 'static_cast' : cannot convert from 'const char [3]' to 'char'


а на вызов foo(table<char>() << "6" << "77" << "87");

Format_1.cpp(46): error C2440: 'static_cast' : cannot convert from 'const char [2]' to 'char'


Format_1.cpp(92): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const char [2]' (or there is no acceptable conversion)


А этот код

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

[code]

Ошибка в main() строке foo(table<char>() << "6" << "77" << "87");

[/code]
Format_1.cpp(92): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const char [2]' (or there is no acceptable conversion)


Возможна реальная ошибка в функции
void foo(const table <char>& series)
Re[5]: Переменное число параметров функции по формату
От: dr.Chaos Россия Украшения HandMade
Дата: 15.03.07 10:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dr.Chaos,




DC>>Ты хоть код приведи что ли и ошибку, а то я на семинар по телепатии еще не ходил.

А>Format_1.cpp(93): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const char [2]' (or there is no acceptable conversion)
А>Format_1.cpp(58): warning C4018: '<' : signed/unsigned mismatch
А>....


А>Короче не может преобразовать char[2] в char похоже что тащит широкий символ в обычный — неясно зачем и почему. Зато со string все ОК и так


А с чего бы ему преобразовывать char[2] = {'6','\0'} (массив char'ов) в один char? Я же сказал, напиши специализацию для char'a.



  template <typename T,typename Y>
  T my_cast(Y anOther)
  {
      return static_cast<T>(anOther);
  }

  template <>
  char my_cast(char * str)
  {
      return *str;
  }


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


или так внешней функцией.

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


Возможно в обоих случаях нужно будет доработать напильником.
Идея понятна?
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[5]: Переменное число параметров функции по формату
От: PWW  
Дата: 15.03.07 10:32
Оценка:
Опечатка

Опечатка а на вызов foo(table<char>() << "6" << "77" << "87");
Читать а на вызов foo(table<char>() << "6" << "7" << "8");

Format_1.cpp(46): error C2440: 'static_cast' : cannot convert from 'const char [2]' to 'char'


Опечатка
Format_1.cpp(92): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const char [2]' (or there is no acceptable conversion)

Читать Случайно попавший текст
Re[6]: Переменное число параметров функции по формату
От: PWW  
Дата: 15.03.07 11:26
Оценка:
Здравствуйте, dr.Chaos, Вы писали:


DC>Возможно в обоих случаях нужно будет доработать напильником.

DC>Идея понятна?

Выбрал этот путь

template <typename T,typename Y>
  T my_cast(Y anOther)
  {
      return static_cast<T>(anOther);
  }


Происходит запутавание компилятора на
foo(table<long>() << 4 << 5 << 6);

пишет что не может конвертировать int в long.

и В А Щ Е !!!! как отлаживать код в когда пишешь с использованием template есть какието вразумительные способы?
Re[6]: Переменное число параметров функции по формату
От: PWW  
Дата: 15.03.07 11:45
Оценка:
Здравствуйте, dr.Chaos, Вы писали:


DC>А с чего бы ему преобразовывать char[2] = {'6','\0'} (массив char'ов) в один char? Я же сказал, напиши специализацию для char'a.



DC>

DC>  template <typename T,typename Y>
DC>  T my_cast(Y anOther)
DC>  {
DC>      return static_cast<T>(anOther);
DC>  }

DC>  template <>
DC>  char my_cast(char * str)
DC>  {
DC>      return *str;
DC>  }


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

DC>


DC>или так внешней функцией.


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


DC>Возможно в обоих случаях нужно будет доработать напильником.

DC>Идея понятна?


Избрал

template <typename T,typename Y>
 T my_cast(Y anOther)
 {
     return static_cast<T>(anOther);
 }


Теперь компилятор запутывается на foo(table<long>() << 4 << 5 << 6);

пишет что не может конвертировать int а long.

Возникает вопрос — а как вообще отлаживать шаблоны? Ошибки могут быть и в другом месте программы. Есть технологии?
Re[7]: Переменное число параметров функции по формату
От: dr.Chaos Россия Украшения HandMade
Дата: 15.03.07 11:57
Оценка:
Здравствуйте, PWW, Вы писали:

PWW>Избрал


PWW>
PWW>template <typename T,typename Y>
PWW> T my_cast(Y anOther)
PWW> {
PWW>     return static_cast<T>(anOther);
PWW> }
PWW>


PWW>Теперь компилятор запутывается на foo(table<long>() << 4 << 5 << 6);


PWW>пишет что не может конвертировать int а long.


Где именно не может конвертировать? В операторе <<, в my_cast??

PWW>Возникает вопрос — а как вообще отлаживать шаблоны? Ошибки могут быть и в другом месте программы. Есть технологии?


Только мозги и знание механизма инстанирования .
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[8]: Переменное число параметров функции по формату
От: PWW  
Дата: 15.03.07 12:24
Оценка:

Где именно не может конвертировать? В операторе <<, в my_cast??
Только мозги и знание механизма инстанирования .


Отрывок

//dr.Chaos
   template<typename Y>
  const table& operator<<(const Y& v) const // константность - потому что это rvalue->const lvalue
  {    
      cont_.push_back(my_cast<T>(v));
    return *this;
  }
 template <typename T,typename Y>
 T my_cast(Y anOther)
 {
     return static_cast<T>(anOther);
 }


Ошибка
Format_1.cpp(44): error C2662: 'T table<T>::my_cast<T,const char*>(Y)' : cannot convert 'this' pointer from 'const table<T>' to 'table<T> &'
        with
        [
            T=std::string,
            Y=const char *
        ]
        and
        [
            T=std::string
        ]
        and
        [
            T=std::string
        ]

d:\Globus\ORO_Format_2\ORO_Format_1\ORO_Format_1.cpp(44): error C2662: 'T table<T>::my_cast<T,Y>(Y)' : cannot convert 'this' pointer from 'const table<T>' to 'table<T> &'
        with
        [
            T=int,
            Y=int
        ]
        and
        [
            T=int
        ]
        and
        [
            T=int
        ]

d:\Globus\ORO_Format_2\ORO_Format_1\ORO_Format_1.cpp(44): error C2662: 'T table<T>::my_cast<T,Y>(Y)' : cannot convert 'this' pointer from 'const table<T>' to 'table<T> &'
        with
        [
            T=std::string,
            Y=std::string
        ]
        and
        [
            T=std::string
        ]
        and
        [
            T=std::string
        ]



Только мозги и знание механизма инстанирования .


Вот мы его и изучаем

Ещё раз привожу код программы (Может быть Вы её откомпилируете plis)

#include "vector"
#include "iostream"

using namespace std;

#define table_int table<int>()
#define table_long table<long>()
#define table_string table<string>()

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(); }
//dr.Chaos
   template<typename Y>
  const table& operator<<(const Y& v) const // константность - потому что это rvalue->const lvalue
  {    
      cont_.push_back(my_cast<T>(v));
    return *this;
  }
 template <typename T,typename Y>
 T my_cast(Y anOther)
 {
     return static_cast<T>(anOther);
 }

 /*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]<<" "; cout<<endl;
}
void foo(const table <int>& series){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i]<<" "; cout<<endl;
}
void foo(const table <long>& series){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i]<<" "; cout<<endl;
}
void foo(const table <char>& series){
  for(int i=0; i<series.size(); ++i) 
      cout<<series.data()[i]<<" "; 
  cout<<endl;
}
void foo(const table <string>& series){
  string  a;
  for(int i=0; i<series.size(); ++i) {
    a=series.data()[i];
    cout<<a.data ( )<<" "; cout<<endl;
  }
}
void foo(const table <int>& series,const table <long>& series2,const table <string>& series3/**/){
  for(int i=0; i<series.size(); ++i) cout<<series.data()[i]<<" ";
  for(int i=0; i<series2.size(); ++i) cout<<series2.data()[i]<<" ";
  string  a;
  for(int i=0; i<series3.size(); ++i) {
    a=series3.data()[i];
    cout<<a.data ( )<<" "; 
  }cout<<endl;
}

int main()
{
  foo(series_builder<int>() << 1 << 2 << 3);
  foo(table<long>() << 4 << 5 << 6);
  foo(table<string>() << "6" << "77" << "88"); 
  //foo(table<char>() << "6" << "7" << "8"); 
  foo(table<int>()<< 1 << 2 << 3, table<long>()  << 4 << 5 << 6, table<string>() << "6" << "77" << "88");
  string  a=("99"),  b="111", c="222";
  foo(table<int>()<< 1 << 2 << 3, table<long>()  << 4 << 5 << 6, table<string>() << a << b <<c);
// после препроцессора
  foo(table_int << 1 << 2 << 3, table_long << 4 << 5 << 6, table_string << a << b <<c);
//Мечта
  //foo(table%i, table%l, table%s)( 1 , 2, 3),(4, 5, 6),( a, b,c);
//ну или
  //foo(table%i, table%l, table%s)( 1 , 2, 3)(4, 5, 6)( a, b,c);
}
Re[9]: Переменное число параметров функции по формату
От: dr.Chaos Россия Украшения HandMade
Дата: 15.03.07 12:48
Оценка:
Здравствуйте, PWW, Вы писали:

PWW>

Где именно не может конвертировать? В операторе <<, в my_cast??
PWW>Только мозги и знание механизма инстанирования .


PWW>Отрывок


PWW>
PWW>//dr.Chaos
PWW>   template<typename Y>
PWW>  const table& operator<<(const Y& v) const // константность - потому что это rvalue->const lvalue
PWW>  {    
PWW>      cont_.push_back(my_cast<T>(v));
PWW>    return *this;
PWW>  }
PWW> template <typename T,typename Y>
PWW> T my_cast(Y anOther)
PWW> {
PWW>     return static_cast<T>(anOther);
PWW> }
PWW>


Если ты my_cast запихнул в table (зачем только не ясно ), поставь ему что ли const . А вообще это внешняя функция.

P.S. Компилировать я не буду, я дал совет как это решить. Ты бы и сам до этого быстро дошел, если бы почитал книжки по шаблонам Джосатиса например здесь кажись было.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[10]: Переменное число параметров функции по формату
От: PWW  
Дата: 15.03.07 13:00
Оценка:
Вынес функции из класса


template <typename T,typename Y>
 T my_cast(Y anOther)
 {
     return static_cast<T>(anOther);// err
 }

template <>
  char my_cast(char * str)
  {
      return *str;
  }


Ошибка
Format_1.cpp(15): error C2440: 'static_cast' : cannot convert from 'const char *' to 'char'



Если поменять местами эти функции

Format_1\ORO_Format_1.cpp(15): error C2912: explicit specialization; 'char my_cast(char *)' is not a specialization of a function template


Ругается на foo(table<char>() << "6" << "7" << "8");
остальные проходят
Re[11]: Переменное число параметров функции по формату
От: dr.Chaos Россия Украшения HandMade
Дата: 15.03.07 13:51
Оценка:
Здравствуйте, PWW, Вы писали:

PWW>Вынес функции из класса



PWW>
PWW>template <typename T,typename Y>
PWW> T my_cast(Y anOther)
PWW> {
PWW>     return static_cast<T>(anOther);// err
PWW> }

PWW>template <>
PWW>  char my_cast(char * str)
PWW>  {
PWW>      return *str;
PWW>  }
PWW>


PWW>Ошибка

PWW>
PWW>Format_1.cpp(15): error C2440: 'static_cast' : cannot convert from 'const char *' to 'char'
PWW>


Ну сказано же — Доработать напильником . Поставь там const'ы где надо и все заработает.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[12]: Переменное число параметров функции по формату
От: PWW  
Дата: 16.03.07 09:08
Оценка:
Здравствуйте, dr.ChaosНу сказано же — Доработать напильником . Поставь там const'ы где надо и все заработает.

Короче странная ситуация, всё это не работает похоже только потому что компилятор подставляет первым шаблоную my_cast, а на второй не шаблонный не реагирует. Хотя у Джосатиса написано что приоритет у не шаблонных функций.
(хотя возможно перегруженый оператор << подсовавает не то)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.