Re: template template arguments and default parameters
"avasilev" <alxvasilev@gmail.com> wrote in message
news:51fb3300-fab4-40d1-93c1-5b3b0d05c17b@i9g2000yqe.googlegroups.com...
On Oct 6, 3:44 pm, Victor Bazarov <v.baza...@comcast.invalid> wrote:
On 10/6/2011 8:19 AM, avasilev wrote:
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 amo ding the following:
template<template<key, value> class T>
First, I believe this ought to be
template<template<class,class> class T>
second, it limits the number of arguments to 2, which isn't true for
most Standard containers since they usually have a comparator and an
allocator types added (although those usually have defaults).
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::map<std::basic_string<char>, std::basic_string<char> >&,
int)'
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.
AFAIK, no.
Yes there is:
template< template<typename T1, typename T2, typename T3, typename T4> class
C, typename T1, typename T2, typename T3, typename T4>
void parse( C<T1, T2, T3, T4>& arg){
.....
}
And overload it if you want more versions, i.e three parameters:
template< template<typename T1, typename T2, typename T3> class C, typename
T1, typename T2, typename T3>
void parse( C<T1, T2, T3>& arg){
.....
}
--- Posted via news://freenews.netfront.net/ - Complaints to news@netfront.net ---