启用从"vector<const T>&"到"const vector&"的隐式转换<T>



>假设我们定义了一个类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&是一项非常不同的任务,因为它将涉及额外的生命周期管理状态和/或可疑的法律类型别名。

相关内容

  • 没有找到相关文章

最新更新