将std :: pair隐式转换为第二个元素

时间:2018-02-06 16:21:56

标签: c++11 stl

我有一个it类型的对象std::pair<Key, T>,并希望定义一个隐式转换为对第二个元素的引用。

T& convert(std::pair<Key, T>& it) { return it.second; }
T const& convert(std::pair<Key, T> const& it) { return it.second; }

这可以在class T的定义中隐含地完成吗?理想情况下,我想将it传递给期望T&的函数。

背景:关联容器(std::unordered_map)上的迭代器取消引用类型为std::pair<Key, T>的对象。我想有一个语法,我可以在顺序和关联容器(std::vectorstd::unordered map)之间轻松切换。请考虑以下代码:

std::vector<T> container;
// std::unordered_map<Key, T> container;
void func(T&);

for (auto& it : container) {
    func(it);
}

1 个答案:

答案 0 :(得分:1)

  

这可以在T类的定义中隐式完成吗?

是和否。

是部分:您创建转换构造函数。

class T 
{
  public: 
    // Use a delegating constructor to implement shi
    template <typename Key> T(std::pair<Key, T> const& item) : T(item.second) {}
};

没有部分:您无法获得非const引用。转换构造函数将创建一个临时的,它将始终生成const引用。

IMO,更好的解决方案是重载func

void func(T&);

template <typename Key>
void func(std::pair<Key, T>& item)
{
    func(item.second);
}