Различать указатели и переменные данных - PullRequest
1 голос
/ 04 октября 2011

для функции с переменным числом параметров ...

void function(int count,...)
{
...
}

как мне различать указатели и переменные данных ... учитывая, что я не знаю типов заранее.т.е.

char *p=new char();
*p='v';
function(2,5,p);

как узнать, является ли p указателем, чтобы его можно было обрабатывать таким образом внутри функции ... т.е. если бы это был указатель, я бы использовал * p, иначе только p и т. д. функциютаким образом, быть спроектированным будет общей функцией, с указателями и данными ..

любой тип ответа является приемлемым .. заранее спасибо ...

Ответы [ 3 ]

2 голосов
/ 04 октября 2011

Это невозможно при использовании переменных аргументов.Тип аргументов должен быть известен при вызове va_arg.

Один из возможных способов сделать это - передать указатели на самоописываемые данные, такие как варианты .

2 голосов
/ 04 октября 2011

Очень хорошее объяснение ЗДЕСЬ

0 голосов
/ 04 октября 2011

Короткий ответ: ты не можешь. Переменный список аргументов не имеет информации о типе. Вот почему для таких функций, как printf и scanf требуется строка формата

printf("%s %d\n","here is the magic number",42);

Вам необходимо либо задокументировать, как должна вызываться ваша функция, либо использовать форматную строку, как printf.

Переменный список аргументов поддерживается в C ++, но не объектно-ориентирован или не безопасен, и есть лучшие альтернативы. Одна из альтернатив C ++ - использовать такую ​​конструкцию, как оператор <<, как и в случае cout (эквивалент C ++ printf)

cout << "here is the magic number" << ' ' << 42 << endl;

Вы можете реализовать это для своего собственного класса, как это

class VarArgs
{
public:
   VarArgs & operator << (int value)
   { 
      //do something 
      return *this;
   }

   VarArgs & operator << (char value)
   { 
      //do something 
      return *this;
   }

   VarArgs & operator << (char *value)
   { 
      //do something 
      return *this;
   }

   //etc.
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...