比较地图对象及其引用C ++

时间:2016-06-01 09:26:44

标签: c++ reference stdmap

我有以下地图

map<int,string> m1;
map<int,string> m2;
call(m1);
call(m2);

template<typename T>
void call(T &m)
{
  // Compare if m == m1
  How to do?
}

我需要知道在运行时在当前函数中调用了m1m2中的哪一个。

2 个答案:

答案 0 :(得分:3)

如果您想根据地图内容进行检查,可以使用operator==

template<typename T>
void call(T &m)
{
  if (m == m1)
    ...
}

如果您想确定他们是否是同一个实例,因为参数是通过引用传递的,您可以比较他们的地址:

template<typename T>
void call(T &m)
{
  if (&m == &m1)
    ...
}

正如@Smeeheey指出的那样,你需要考虑如何在模板函数中提供比较对象(即m1或其地址),并且从你的片段中不清楚。

答案 1 :(得分:1)

要改进已接受的答案,如果要避免因call以外的类型调用函数map<int, string>而导致编译器错误,则需要模板帮助函数:

template <typename T, typename U>
bool is_equal(const T& t, const U& u)
{
    return false;
}

template <typename T>
bool is_equal(T& t, T& u)
{
    return &t == &u;
}

template<typename T>
void call(T &m)
{
  // Compare if m == m1
  if(is_equal(m, m1))
    std::cout << "Yes";
  else
    std::cout << "No";
}