Вы можете сделать довольно легко:
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()); }
Я должен отметить, что я, вероятно, добавил бы тест, чтобы увидеть, является ли контейнер 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
Пример, бесстыдно взятый из litb
;)