- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个模板类 template<typename T, typename R>
. R 的类型是 vector<T*>
或 list<T*>
.
我想让我的类重载[]
运算符,如果它是一个 vector ,我将使用内置的 []
运算符以提高效率,如果它是一个列表,我将使用迭代器实现它。
对我来说,这听起来像是模板特化的工作,所以我想写这样的东西:
template<typename T, typename R>
T& tContainer_t<T, R>::operator[]( unsigned i )
{
//TODO with iterators
}
template<>
T& tContainer_t::operator[]<T, std::vector<T*> >( unsigned i )
{
// TODO with built in [] operator
}
这是错误的,编译器不允许这样做。
有没有办法让它工作,或者我应该使用 typeid()
在运行时区分两个对象并采取相应行动?
最佳答案
使用模板的方法是在一个可以部分特化的类中创建一个静态辅助函数。但是,我会做的是:
template<typename T, typename R>
T& tContainer_t<T, R>::operator[]( unsigned i )
{
//assuming that the container refernce is name container;
typename R::iterator itr = container.begin();
std::advance(itr, i);
return *itr;
}
std::advance
保证了对于一个有随机访问迭代器的容器(比如vector),是常数时间(基本上就是做iterator + n),可以快到做指针查找 vector 执行。否则,它执行 n 次 iterator++
,这将是线性时间。 const 版本将使用 const_iterator,但本质上是相同的。
这样做可以让您正确处理不同类型的容器(不仅仅是 vector 和列表),而无需修改代码。
关于c++ - 运算符重载和模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10719145/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!