A
avasilev
HI all,
I have implemented a function that takes a string as input, parses it,
and outputs a map<string, string> of name=value pairs. Something like:
bool parse(const string& input, map<string, string>& output)
However, to make it more flexible, I want to be able to change the
kind of map that is being used, so that it can be a hash_map, multimap
or whatever. For this purpose I need to make the function a template
function. I want as parameter for the template the "map" class name,
and I will use a specialized <string,string>version of it.
I am doing the following:
template <template <key, value> class T>
bool parse(const string& input, T<string,string> output)
{
....
}
then I try to call the function like this:
std::map<string, string>;
string input = "name=val;name1=val1"
parse<std::map>(input , m);
But this fails to compile, with the error (using gcc):
error: no matching function for call to
'parse(std::basic_string<char>&, std::map<std::basic_string<char>,
std::basic_string<char> >&)'
I have tried to compile an example where I define the 'map' class, and
it takes strictly two parameters. This compiles fine. It also compiles
if I provide the default template parameters of the std::map class:
template < template < class k, class v, class Compare, class
Allocator> class T >
void parse(const string& input, T < string , string, less<string>,
allocator<pair<const string,string> > > output)
My question is - is there a way to make what I want without providing
all default template parameters, the least reason being that a
different 'map' class may have different default template parameters.
Thanks in advance
Best regards
Alex
I have implemented a function that takes a string as input, parses it,
and outputs a map<string, string> of name=value pairs. Something like:
bool parse(const string& input, map<string, string>& output)
However, to make it more flexible, I want to be able to change the
kind of map that is being used, so that it can be a hash_map, multimap
or whatever. For this purpose I need to make the function a template
function. I want as parameter for the template the "map" class name,
and I will use a specialized <string,string>version of it.
I am doing the following:
template <template <key, value> class T>
bool parse(const string& input, T<string,string> output)
{
....
}
then I try to call the function like this:
std::map<string, string>;
string input = "name=val;name1=val1"
parse<std::map>(input , m);
But this fails to compile, with the error (using gcc):
error: no matching function for call to
'parse(std::basic_string<char>&, std::map<std::basic_string<char>,
std::basic_string<char> >&)'
I have tried to compile an example where I define the 'map' class, and
it takes strictly two parameters. This compiles fine. It also compiles
if I provide the default template parameters of the std::map class:
template < template < class k, class v, class Compare, class
Allocator> class T >
void parse(const string& input, T < string , string, less<string>,
allocator<pair<const string,string> > > output)
My question is - is there a way to make what I want without providing
all default template parameters, the least reason being that a
different 'map' class may have different default template parameters.
Thanks in advance
Best regards
Alex