Как я могу перечислить по списку аргументов в упакованном вариадическом шаблоне?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как я могу перечислить по списку аргументов в упакованном вариадическом шаблоне?

Сообщение Anonymous »

Я пытаюсь найти метод для итерации по списку аргументов шаблонов с вариадическим шаблоном. в вектор и хранить все данные о типах, в вектор. В ходе этого процесса также должен быть отдельный вектор, который хранит отдельные очаги того, в каком порядке вошли аргументы. В качестве примера, когда вы push_back (a_float) вы также делаете push_back ('f'), который просто хранит отдельный символ, чтобы узнать порядок данных. Я также мог бы использовать строку std :: std здесь и просто использовать +=. Вектор использовался в качестве примера. Таким образом, буквально невозможно использовать рекурсивный вызов, поскольку фактическая реализация, в которой будет разместиться все это, будет расширена во время компиляции; И вы не можете привлечь макрос. Поэтому вместо этого я использую более запутанный метод, который включает в себя построение типа и передачу этого типа в шаблон варида, расширяя его внутри вектора, а затем просто итерацию. Однако я не хочу называть функцию как: < /p>

foo(arg(1), arg(2.0f), arg("three");
< /code>

Значит, реальный вопрос заключается в том, как я могу сделать без этого? Чтобы дать вам, ребята, лучше понять, что на самом деле делает код, я вставил оптимистичный подход, который я сейчас использую. < /P>

struct any {
void do_i(int e) { INT = e; }
void do_f(float e) { FLOAT = e; }
void do_s(char* e) { STRING = e; }

int INT;
float FLOAT;
char *STRING;
};

template struct get { T operator()(const any& t) { return T(); } };
template struct get { int operator()(const any& t) { return t.INT; } };
template struct get { float operator()(const any& t) { return t.FLOAT; } };
template struct get { char* operator()(const any& t) { return t.STRING; } };

#define def(name) \
template \
auto name (T... argv) -> any { \
std::initializer_list argin = { argv... }; \
std::vector args = argin;
#define get(name,T) get()(args[name])
#define end }

any arg(int a) { any arg; arg.INT = a; return arg; }
any arg(float f) { any arg; arg.FLOAT = f; return arg; }
any arg(char* s) { any arg; arg.STRING = s; return arg; }
< /code>

Я знаю, что это противно, однако это чистый эксперимент и не будет использоваться в производственном коде. Это чисто идея. Это, вероятно, можно сделать лучше. Но пример того, как вы бы использовали эту систему: < /p>

def(foo)
int data = get(0, int);
std::cout

foo(arg(1000));
< /code>

Я должен построить новый тип, который очень эстетический, но это не значит, что эти макросы тоже не являются. Помимо того, что я просто хочу сделать:
foo (1000); < /p>

Я знаю, что это можно сделать, мне просто нужен какой -то метод итерации или, что более важно, некоторые методы std :: get для упакованных списков аргументов. Что я уверен, можно сделать. Мне не требуется ничего другого, и я добавлю чеки для использования type_traits, чтобы подтвердить, что переданные аргументы действительно являются правильными для создания ошибки времени компиляции, если данные неверны. Это не проблема. Мне также не нужна поддержка чего -либо, кроме этих типов POD. Я хорошо знаю, насколько хрупким и сломанным является код. Это эксперимент Merley, и я позже могу исправить проблемы с данными, не являющимися POD, и сделать его более безопасным и полезным.>

Подробнее здесь: https://stackoverflow.com/questions/723 ... ument-list
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»