Я пытаюсь найти метод для итерации по списку аргументов шаблонов с вариадическим шаблоном. в вектор и хранить все данные о типах, в вектор. В ходе этого процесса также должен быть отдельный вектор, который хранит отдельные очаги того, в каком порядке вошли аргументы. В качестве примера, когда вы 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
Как я могу перечислить по списку аргументов в упакованном вариадическом шаблоне? ⇐ C++
Программы на C++. Форум разработчиков
1757433226
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, и сделать его более безопасным и полезным.>
Подробнее здесь: [url]https://stackoverflow.com/questions/7230621/how-can-i-iterate-over-a-packed-variadic-template-argument-list[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия