CPP模板参数

时间:2018-09-07 10:03:45

标签: c++

以下代码的一致性如何?-

TMAP.h

#include <algorithm>
#include <map>

template <class K, class V>
class TMAP
{ 
private:
    std::map <K,V>  map_K_V;

public:
    bool key_exists(const K& key) { return map_K_V.count( key ) > 0; }

    bool insert(const K& key, const V& value)
    {
        if (!key_exists(key))
        {
            if (map_K_V.insert( std::make_pair( key, value ) ).second)
            {
                return true;
            }
        }
        return false;
    }

    V get_value(const K& key)
    {
        return map_K_V[ key ];
    }
};

模板就像 std :: map 一样,只是为了其他用途而更加有条理。

main.cpp

#include <iostream>
#include "TMAP.h"

class A;

TMAP< std::string, A* > map_cntr;

class A
{
  public:
    A( std::string nm )
    {
      name = nm;
      std::cout << "A: " << name << ", object created." << std::endl;
    }

    ~A()
    {
      std::cout << "A: " << name << ", object destroyed." << std::endl;
    }

    void printName()
    {
      std::cout << "A: printName - " << name << std::endl;
    }

    void setName( std::string nm )
    {
        name = nm;
    }

  private:
    std::string name;
};

int main() {
    // Setting
    A* obj1 = new A( "obj1" );
    map_cntr.insert( "obj1", obj1 );
    obj1->printName();

    A* obj2 = new A( "obj2" );
    map_cntr.insert( "obj2", obj2 );
    obj2->printName();

    // Getting
    A* obj1_cpy;
    std::string obj1_name = "obj1";

    if (map_cntr.key_exists(obj1_name))
    {
        obj1_cpy = map_cntr.get_value(obj1_name);
        obj1_cpy->printName();
        obj1_cpy->setName("OBJ1");
        obj1_cpy->printName();
    }
}

输出:

A: obj1, object created.  
A: printName - obj1  
A: obj2, object created.  
A: printName - obj2  
A: printName - obj1  
A: printName - OBJ1  

输出符合预期。此外,我在某处听说使用 std :: string 作为模板参数并不理想,就像在上述情况下与内存或指针有关。公平吗?

1 个答案:

答案 0 :(得分:1)

std::map<const char*, Value>是“问题” ,因为它仅比较指针而不是C字符串内容。

使用std::map<std::string, Value>很好。