>假设我们定义了一个类template<typename T> class vector
,它的行为与std::vector
类似,只是我们能够更改它的类定义。
还假设我们有一个函数f(const vector<T>&)
.
我们如何启用隐式转换,允许我们将vector<const T>&
传递到f
?
我认为这种隐含转换是明智的,因为我相信const vector<T>&
施加的限制是vector<const T>&
施加的限制的超集。但是,任何可能具有启发性的指导将不胜感激。
假设f
确实是某些具体T
的函数,而不是函数模板(即template<typename T> f(vector<T> const&)
(,那么vector<T>
内的以下运算符应该可以工作:
template<typename U = T, typename = std::enable_if_t<std::is_const<U>{}>>
operator vector<std::remove_const_t<U>>() const {
// ...
}
在线演示
但是,f
不能是独立的函数模板,因为它的T
只会被推断为自身const
并且不会进行转换。重载可以解决这个问题,但会很丑陋。
注意:这可能只是复制原始vector
内部的元素;返回一个以某种方式别名原始vector<T const>
内部的vector<T> const&
是一项非常不同的任务,因为它将涉及额外的生命周期管理状态和/或可疑的法律类型别名。