LINUX.ORG.RU

История изменений

Исправление AIv, (текущая версия) :

class my_special_object{
...
   my_special_object( const char* S);
...
   template<typename T> my_special_object& operator , (const T& other){
    ...
    return *this;
  }
};
#define WOUT(args...){                                          \ 
   my_special_object _tmp_special_object( #args );  \
   _tmp_special_object,args;                                     \
}
...
int a = 2; const char*b = "qwerty";
WOUT( a*2, b+1 );

если конструктор разбирает входящую строку по токенам разделенным запятыми (с учетом скобок), и оп. запятая берет очередной токен и выводит аргумент, то получаем на выходе че нить вроде:

a*2=4; b="werty";

Аналогично делается фича, позволяющая описывать например поля структуры (получать имя поля, тип, смещение, размер массива если поле массив и пр.) и потом это где нить юзать. При этом перегрузка запятой стреляет только если первым аргументом идет специально для нее сделанный объект.

Исходная версия AIv, :

class my_special_object{
...
   my_special_object( const char* S);
...
   template<typename T> my_special_object& operator , (const T& other){
    ...
    return *this;
  }
};
#define WOUT(args...)
WOUT( args... ) { 
   my_special_object _tmp_special_object( #args ); 
   _tmp_special_object,args; 
}
...
int a = 2; const char*b = "qwerty";
WOUT( a*2, b+1 );

если конструктор разбирает входящую строку по токенам разделенным запятыми (с учетом скобок), и оп. запятая берет очередной токен и выводит аргумент, то получаем на выходе че нить вроде:

a*2=4; b="werty";

Аналогично делается фича, позволяющая описывать например поля структуры (получать имя поля, тип, смещение, размер массива если поле массив и пр.) и потом это где нить юзать. При этом перегрузка запятой стреляет только если первым аргументом идет специально для нее сделанный объект.