2015-10-06 7 views
0

Обычно в моем коде мне нужно использовать специальные функции для различных переменных, т.е.Как читать число аргументов - C++

object->SetStatus("var1",1); object->SetAddress("var1",&var1); 
object->SetStatus("var2",1); object->SetAddress("var2",&var2); 
object->SetStatus("var3",1); object->SetAddress("var3",&var3); 
... 

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

object->function(var1,var2,var3,...); 

для достижения этой цели я должен решить 3 проблемы

  1. мне нужно прочитать число аргументов при вызове функции()
  2. мне нужно разобрать как-то имена аргументов в коде
  3. Поскольку переменные не одного и того же типа, мне нужно найти способ, чтобы сделать функцию() типа «прозрачный»

Поскольку I Я новичок в C++-кодировании, я пытался найти что-то подобное, но ничего не нашел.

Любая помощь, совет или замечание более чем приветствуются!

+2

Эллипсис - это ключевое слово, которое вы ищете, но, как правило, часто бывают лучшие вещи, которые вы можете сделать, избегая их использования. –

+0

Какое приложение вы кодируете (возможно, какой-то переводчик)? В C++ 11 или C++ 03? Каков тип 'var1'? –

+0

@BasileStarynkevitch: Я кодирую в структуре анализа данных CERN, которая называется root. Типы - это 'int',' double' и 'float', числовые – Thanos

ответ

0

Существует несколько способов сделать это. Один из способов - сделать класс Base, и весь ваш тип переменной наследуется от этого базового класса. Затем передайте map<string,Base> в качестве аргумента функции. имя переменной будет ключевым, а значение будет действительными переменными. Перейдите по карте и установите и присвойте значения методам.

0

Вы можете рассмотреть некоторые variadic template, если кодирование в C++ 11 или C++ 14. Существует значительная литература по этому вопросу (например, this tutorial), что немного сложно (поэтому объяснение здесь здесь нецелесообразно). Читайте также о parameter pack

Вы также можете использовать C стиль varargs используя <cstdarg>

Возможно std::initializer_list может быть полезно тоже.

Смежные вопросы