jose gabriel
jose gabriel

Reputation: 752

I need someone who explain me these lines of code

I need someone who explain me this code, line by line. I specially don't understand this line:

operator std::map<T, U>()

Thank you very much.

template <typename T, typename U>
class create_map 
{ 
    std::map<T, U> m_map;
public:
    create_map(const T& key, const U& val) 
    {  
        m_map[key] = val;
    }
    create_map<T, U>& operator()(const T& key, const U& val) 
    {
        m_map[key] = val;
        return *this;
    }
    operator std::map<T, U>()     
    {
        return m_map;     
    }
};

Upvotes: -1

Views: 202

Answers (4)

Sarfaraz Nawaz
Sarfaraz Nawaz

Reputation: 361302

operator std::map<T, U>()     
{
         return m_map;     
} 

This is user-defined conversion function.

That means, you can write this:

//obj is an object of type create_map
create_map<int,std::string> obj(1,"Nawaz");

//obj implicitly converts into std::map type!
std::map<int,std::string> map_inst=obj;

See this topic to know more about user-defined conversion function:

User Defined Conversions in C++

You can see this as well: Implicit conversion sequences (C++ only)


create_map<T, U>& operator()(const T& key, const U& val) 
{
      m_map[key] = val;
      return *this;
}

This actually overloads the operator(), which internally inserts or updates (key,val) pair into the m_map; just see the function definition as to what it does.

So using this function you can write code like this,

obj(2,"Sarfaraz"); //this inserts the pair into the underlying m_map;

I would also suggest you to explore std::map a bit more, especially the overloaded operator[] in std::map.

Upvotes: 6

Cheers and hth. - Alf
Cheers and hth. - Alf

Reputation: 145204

Code:

template <typename T, typename U>
class create_map 
{ 
    std::map<T, U> m_map;
public:
    create_map(const T& key, const U& val) 
    {  
        m_map[key] = val;
    }
    create_map<T, U>& operator()(const T& key, const U& val) 
    {
        m_map[key] = val;
        return *this;
    }
    operator std::map<T, U>()     
    {
        return m_map;     
    }
};

The purpose of this code is to be able to specify a map with specific key/value pairs, by chaining calls to operator(), like

create_map<int, std::string>( 1, "blah" )( 2, "hah" )( 3, "doh" )

Since the class does not have a default constructor, there's no way to use it to create an empty map. That may be by design. Or it may be a design error.

The

operator std::map<T, U>()     
{
    return m_map;     
}

defines a conversion to std::map<T, U>, which is the end result of it all.

It can be invoked implicitly wherever a create_map is specified and a std::map is expected, such as using a create_map expression as argument in a function call.

However, it can be pretty inefficient since it copies the map. The compiler may well optimize away the copying. But it’s ungood to needlessly rely on Quality Of Implementation (although sometimes that is the best that one can do).

So it should instead be

operator std::map<T, U> const& () const
{
    return m_map;     
}

The const at the end there allows a create_map to be declared as const and used.

With this conversion to reference there is the same problem as with using reference arguments, namely a theoretical possibility of aliasing, where code that retains a reference to const is not prepared to deal with changes of the referred object. But in practice it’s not a problem. For example, as formal argument one just writes std::string const& s (instead of just std::string s) as a matter of course, and very few if any errors result from that – I’ve never experienced any problem.

Cheers & hth.,

Upvotes: 1

datenwolf
datenwolf

Reputation: 162164

There's not much to understand about it. operator std::map<T, U>() overrides the class' conversion operator (which takes no parameters) to provide an object instance of type std::map<T, U>. std::map is a STL standard class for associative key->value storage. In your case it maps from keys of type T to values of type U. T and U have been undefined so far (you wrote template class, but where are the template parameters?)

The conversion operator allows to use the class instance in place of the type the operator provides conversion for, like this.

class foo {
    operator char const *() {
        return "foo instance as char const *";
    }
};

// ...

void bar(foo &f)
{
    // here the class instance is used as if it were a char const *
    cout << f << endl;
}

Upvotes: 0

kynnysmatto
kynnysmatto

Reputation: 3892

The line

operator std::map<T, U>()

defines a function that will be called when your create_map object is used like an std::map somewhere in the code.

An easier example would be:

class A
{
public:
  operator int()
  {
    return 3;
  }
};

int main()
{
  A a;
  cout << a << endl;
}

Now the computer finds out that it doesn't know how to print variable a, but it knows how to convert it to an int and then print it. So "3" gets printed.

Upvotes: -1

Related Questions