lundi 27 septembre 2021

Variadic functions to take any number of objects

I have a class called parser with a member function madd_arguments(const argument args, ...). argument is a separate class and has a member variable arg_name to differentiate one from another. I want the function madd_arguments to accept any number of argument objects. To achieve this, I have the following code:

class argument{
private:
    std::string arg_name;                        
public:                             
    argument(const std::string& ARG_NAME) : arg_name(ARG_NAME){}     
    friend class parser;
};
#define add_arguments(...) madd_arguments(__VA_ARGS__, argument("END_HERE"))

#include "arg.h"

class parser {
private:
    std::vector<argument> known_arguments;                      //holds all arguments
public:
    void madd_arguments(const argument args, ...);
};


void parser::madd_arguments(const argument args, ...) {
    va_list vargs;
    for (va_start(vargs, args); args.arg_name != "END_HERE"; args = va_arg(vargs, const argument)){
        known_arguments.push_back(args);
    }

    va_end(vargs);
}

and my main:


int main() {

    argument a("name");
    a.set_flags("-v", "-verbose", "bobby", "jones");

    argument b("string argument");

    parser p;
    p.add_arguments(a,b);
}

but I get the following errors: error: passing ‘const argument’ as ‘this’ argument discards qualifiers [-fpermissive] _start(vargs, args); args.arg_name != "END_HERE"; args = va_arg(vargs, const argument)){ and error: passing ‘const std::vector<argument>’ as ‘this’ argument discards qualifiers [-fpermissive]known_arguments.push_back(args);

After looking at other posts on here I figured that I would have to make the member function madd_arguments a const function but I can't because I am going to make changes to the variable known_arguments which is a member of the parser object.

I used macro and the va_list based on this post: How do I write functions that accept unlimited arguments?. Anybody know how I can get around this or should I just go back to using variadic templates instead?

Aucun commentaire:

Enregistrer un commentaire