c++ - 如何测试模板参数是否是一对关联容器?

标签 c++ templates stl

假设我想制作一个模板化函数,返回任何 STL 容器的第一个元素。一般的方式是:

template<typename Container>
Container::value_type first(Container c){
    return *(c.begin());
}

这适用于 vector 、列表、双端队列、集合等。

然而,对于成对关联容器(std::map),如果想要

return c.begin()->second;

如果我有一对关联容器,我该如何测试(在函数中或使用模板特化)?

STL 容器似乎没有附加任何特征。是否可以检查它是否具有::key_type ?

最佳答案

你可以很容易地做到:

namespace result_of // pillaged from Boost ;)
{
  template <class Value>
  struct extract { typedef Value type; };

  template <class First, class Second>
  struct extract < std::pair<First,Second> > { typedef Second type; };
}

template <class Value>
Value extract(Value v) { return v; }

template <class First, class Second>
Second extract(std::pair<First,Second> pair) { return pair.second; }

template <class Container>
typename result_of::extract< typename Container::value_type >::type
first(const Container& c) { return extract(*c.begin()); }

不过我应该注意,我可能会添加一个测试来查看容器是否为...因为如果容器为,您就在对于未定义的行为。

运动中:

int main(int argc, char* argv[])
{
  std::vector<int> vec(1, 42);
  std::map<int,int> m; m[0] = 43;
  std::cout << first(vec) << " " << first(m) << std::endl;
}

// outputs
// 42 43

示例无耻地取自 litb ;)

关于c++ - 如何测试模板参数是否是一对关联容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2289193/

相关文章:

c++ - 模板类的类型独立对象

c++ - 在 C++ 中执行具有任何类型和数量参数的任何函数的函数

c++ - 函数名称 "mem_fun_t"

c++ - 释放 std::list 成员

c++ - 没有参数的 QDialog 显式构造函数 - 如何正确使用?

c++ - 在 C++ 中捕获默认异常

c++ - 什么是奇怪的重复模板模式(CRTP)?

c++ - 测试迭代器是否指向最后一项?

c++ - 以后可以初始化引用变量吗?

c++ - 克服 "fixing it later"的坏习惯