我有一个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::vector
与std::unordered map
)之间轻松切换。请考虑以下代码:
std::vector<T> container;
// std::unordered_map<Key, T> container;
void func(T&);
for (auto& it : container) {
func(it);
}
答案 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);
}