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

Tri*_*ner 6 c++ templates stl

让我们想象一下,我想制作一个模板化函数,它返回任何stl容器的第一个元素.一般方式是:

template<typename Container>
Container::value_type first(Container c){
    return *(c.begin());
}
Run Code Online (Sandbox Code Playgroud)

这适用于矢量,列表,deques,集等.

但是,对于pair关联容器(std :: map),如果想拥有

return c.begin()->second;
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_* M. 4

你可以很容易地做到:

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()); }
Run Code Online (Sandbox Code Playgroud)

但我应该注意,我可能会添加一个测试来查看容器是否empty...因为如果容器是empty,那么您将面临未定义的行为。

运动中:

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
Run Code Online (Sandbox Code Playgroud)

示例无耻地取自litb;)