Declare a method with default arguments in C++ ( array of string)

Hi Experts,

I have the following method :

void  setState (std::string reason, bool bAfter, std::list<std::string>& allStates);

Is there a way to declare it with default arguments for bool and std::list<std::string> ?

so that I can call it in some places of my code

setState("shutdown");


Thanks,
LVL 2
bachra04Asked:
Who is Participating?
 
phoffricCommented:
Maybe you can handle a "null" list by checking for an empty list:
std::list<std::string> defaultStates;

void  setState (std::string reason, bool bAfter = false, std::list<std::string>& allStates = defaultStates) {
   std::cout << reason << " bAfter = " << bAfter;
   if( !allStates.empty() )
   {
      std::cout << "  " << allStates.back();
      std::cout << "  " << allStates.front();
   }
   std::cout << std::endl;
}

int main() {
   defaultStates.push_back ("ON");
   defaultStates.push_back ("OFF");
   setState("default");
   defaultStates.push_front("the end");
   setState("actual ", true, defaultStates);
}

Open in new window

0
 
jkrCommented:
You can't provide a default argument for a 'std::list<std::string>&', since there is no NULL value for references. But why not just providing a 2nd overload for 'setState()' that only takes one argument, e.g.

void  setState (std::string reason, bool bAfter, std::list<std::string>& allStates);

// ...

void  setState (std::string reason) {

  std::list<std::string> empty_list;

  setState(reasob, true, empty_list); // call original 'setState()' with an empty list
}

Open in new window

0
 
jkrCommented:
BTW, as a side note - you might want to consider passing the 'reason' parameter as a 'string&', too. That will avoid copying the string at each call. And also consider making it 'const'. E.g.

void  setState (const std::string reason, bool bAfter, std::list<std::string>& allStates);

// ...

void  setState (const std::string& reason) {

  std::list<std::string> empty_list;

  setState(reasob, true, empty_list); // call original 'setState()' with an empty list
}
                                          

Open in new window

0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
jkrCommented:
>>Maybe you can handle a "null" list by checking for an empty list:

Which means that you still have t pass an empty list that has to be declared and instantiated. Does not make that very elegant to handle...
0
 
phoffricCommented:
I expect that the author has a reason for wanting to pass in a default list. Personally, I rarely use defaults because once you start, it never ends, and then I think, for others, reading the code becomes a little harder in tracking down whether an overload was called or whether a function with default values was called.
0
 
Subrat (C++ windows/Linux)Software EngineerCommented:
In my opinion, just to achieve the default argument feature, we are creating a global list object or might be a data member. Which is totally unnecessary.
Better approach would be the calling 3-arg version from overloaded 1-arg version as told by JKR-(ID: 40459561).
0
 
phoffricCommented:
I would expect that the author already has some object that represents what is desired to be the default value for the preponderance of cases. We are creating a global list object just to show how to address the author's question.
0
 
sarabandeCommented:
the following compiles without problems:

void  setState (std::string reason, bool bAfter = false, std::list<std::string>& allStates = std::list<std::string>())
{
    if (std::find(allStates.begin(), allStates.end(), reason) != allStates.end())
    {
        allStates.push_back(reason);
    }
}

Open in new window

so if you want a "default" which does nothing you can do it without defining a global list.

of course a "global" states list as suggested by phoffric makes more sense. you probably would provide the list by using a static get function like that:

class Global  // or use any other class ...
{
     static std::list<std::string> & getAllStates()
     {
           static std::list<std::string> allStates;
           return allStates;
     }
     ...
};

Open in new window

you could use it like:

void setState (std::string reason, bool bAfter = false, std::list<std::string>& allStates = std::list<std::string>())
{
    if (allStates.empty() == true)
    {
          allStates = Global::getAllStates();
    }
    if (std::find(allStates.begin(), allStates.end(), reason) != allStates.end())
    {
        allStates.push_back(reason);
    }
}

Open in new window


Sara
0
 
bachra04Author Commented:
Thanks Sara;

It is also a nice suggestion.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.