c++ - 从 `vector 启用隐式转换&` 到 `const 向量&`
问题描述
假设我们定义了一个template<typename T> class vector
行为类似的类,std::vector
除了我们能够改变它的类定义。
还假设我们有一个函数f(const vector<T>&)
。
我们如何启用允许我们将 a 传递到的隐式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>
任务是一项截然不同的任务,因为它会涉及额外的生命周期管理状态和/或有问题的合法类型别名。
推荐阅读
- typescript - 在 Visual Studio 中,我能否以不同于 let/var 的方式突出显示 const 符号,以便使可变变量更加突出?
- verilog - 4 位加法器未正确添加
- javascript - 如何检查`'`和'之间的相等性?
- python - 函数中的参数
- javascript - 在确认支付网关中执行“结帐”时出现问题
- php - Preg 将字符串替换为空;不工作
- assembly - TASM 程序集需要打印一个 3 位变量:D
- python - 如何使用python tkinter中的按钮向上和向下滚动列表框项目
- sql - 如何将 MongoDb 查询从 SQL 转换为 NoSQL
- vbscript - VBScript 中的数组定义差异