Я пытаюсь найти метод для итерации над списком аргументов шаблона шаблона пакета. Теперь, как и при всех итерациях, вам нужен какой-то метод определения количества аргументов в упакованном списке и, что более важно, как индивидуально получать данные из списка упакованных аргументов.
Общая идея состоит в том, чтобы перебирать список, хранить все данные типа int в векторе, хранить все данные типа char * в векторе и хранить все данные типа float в вектор. Во время этого процесса также должен быть отдельный вектор, в котором хранятся отдельные символы того порядка, в который вошли аргументы. Например, когда вы push_back (a_float), вы также делаете push_back ('f'), который просто хранится индивидуальный char, чтобы знать порядок данных. Я мог бы также использовать std::string здесь и просто использовать + =. В качестве примера использовался только вектор.
Теперь, когда объект разработан, сама функция строится с использованием макроса, несмотря на злые намерения, требуемые, поскольку это эксперимент. Таким образом, буквально невозможно использовать рекурсивный вызов, поскольку фактическая реализация, в которой будет размещаться все это, будет расширяться во время компиляции; и вы не можете отменить макрос.
Несмотря на все возможные попытки, я все еще пытаюсь понять, как это сделать на самом деле. Поэтому вместо этого я использую более сложный метод, который включает в себя построение типа и передачу этого типа в шаблон varadic, расширение его внутри вектора, а затем просто повторение этого. Однако я не хочу, чтобы вы вызывали функцию, например:
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-данными и сделать его более безопасным и безопасным для использования.
Спасибо за ваше внимание, и я с нетерпением жду, чтобы помочь.