Я пытаюсь найти метод для перебора списка аргументов шаблона переменной пакета.Теперь, как и во всех итерациях, вам нужен какой-то метод определения количества аргументов в упакованном списке и, что более важно, как по отдельности получать данные из упакованного списка аргументов.
Общая идея состоит в том, чтобы перебиратьсписок, хранить все данные типа int в векторе, все данные типа char * в векторе и все данные типа float в векторе.Во время этого процесса также должен существовать отдельный вектор, в котором хранятся отдельные символы того порядка, в котором были введены аргументы. Например, когда вы нажимаете push_back (a_float), вы также выполняете push_back ('f'), который просто хранитиндивидуальный символ, чтобы узнать порядок данных.Я также мог бы использовать std :: string здесь и просто использовать + =.Вектор просто использовался в качестве примера.
Теперь, как устроена вещь, сама функция создается с использованием макроса, несмотря на злые намерения, это необходимо, поскольку это эксперимент.Таким образом, буквально невозможно использовать рекурсивный вызов, так как фактическая реализация, которая будет содержать все это, будет расширена во время компиляции;и вы не можете использовать макрос.
Несмотря на все возможные попытки, я все еще пытаюсь понять, как на самом деле это сделать.Поэтому вместо этого я использую более запутанный метод, который включает в себя создание типа и передачу этого типа во врадикальный шаблон, расширение его внутри вектора, а затем просто итерацию этого.Однако я не хочу вызывать такую функцию, как:
foo(arg(1), arg(2.0f), arg("three");
Так что настоящий вопрос в том, как мне обойтись без такой?Ребята, чтобы лучше понять, что на самом деле делает код, я вставил оптимистический подход, который я использую в настоящее время.
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<typename T> struct get { T operator()(const any& t) { return T(); } };
template<> struct get<int> { int operator()(const any& t) { return t.INT; } };
template<> struct get<float> { float operator()(const any& t) { return t.FLOAT; } };
template<> struct get<char*> { char* operator()(const any& t) { return t.STRING; } };
#define def(name) \
template<typename... T> \
auto name (T... argv) -> any { \
std::initializer_list<any> argin = { argv... }; \
std::vector<any> args = argin;
#define get(name,T) get<T>()(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; }
Я знаю, что это неприятно, однако это чистый эксперимент,и не будет использоваться в производственном коде.Это чисто идея.Возможно, это можно сделать лучше.Но пример того, как вы будете использовать эту систему:
def(foo)
int data = get(0, int);
std::cout << data << std::endl;
end
очень похож на python.это тоже работает, но единственная проблема в том, как вы вызываете эту функцию.Вот краткий пример:
foo(arg(1000));
Мне необходимо создать новый любой тип, который будет высокоэстетичным, но это не значит, что эти макросы тоже не являются.Помимо этого, я просто хочу использовать опцию: foo (1000);
Я знаю, что это можно сделать, мне просто нужен какой-то итерационный метод или, что более важно, некоторый метод std :: get дляупакованные списки аргументов шаблонов.Что, я уверен, может быть сделано.
Также следует отметить, что я хорошо знаю, что это не совсем дружественно к типу, так как я поддерживаю только int, float, char *, и это нормально для меня.Мне больше ничего не нужно, и я добавлю проверки, чтобы использовать type_traits для проверки того, что переданные аргументы действительно являются правильными, чтобы вызвать ошибку времени компиляции, если данные неверны.Это чисто не проблема.Мне также не нужна поддержка для чего-либо другого, кроме этих типов POD.
Было бы весьма полезно, если бы я мог получить некоторую конструктивную помощь, в отличие от аргументов о моем чисто нелогичном и глупом использовании макросов и типов только POD.,Я хорошо знаю, насколько хрупок и сломан код.Это эксперимент с мерли, и я позже смогу устранить проблемы с данными, не относящимися к POD, и сделать их более безопасными и удобными в использовании.
Спасибо за ваше понимание, и я с нетерпением жду помощи.