I have the following function template:
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <iostream>
#include <string>
#include <vector>
template <typename Streamable>
void printall(std::vector<Streamable>& items, std::string sep = "\n")
{
for (Streamable item : items)
std::cout << item << sep;
}
#endif
Now I'd like to set the default value of sep
to std::endl
instead, which is a function, not a std::string
.
But I'd also like the user to be able to pass in a std::string
.
How must I specify the argument sep
's type to accept both, an arbitrary std::string
as well as std::endl
?
If you want the default value for the second parameter to be std::endl
, then you can simply add an overload that takes only one parameter, and don't provide a default for the string
overload. This will give you the overload set that you desire.
template <typename Streamable>
void printall(std::vector<Streamable>const & items) // gets called when second
// argument is not passed in
{
for (Streamable const & item : items)
std::cout << item << std::endl;
}
template <typename Streamable>
void printall(std::vector<Streamable> const & items, std::string const & sep)
{
for (Streamable const & item : items)
std::cout << item << sep;
}