Sam*_*rtz 2 c++ templates iterator coding-style generic-programming
假设我有一个名为Object的类.Object类有一个成员函数,它想要从容器中读取字符串.假设函数看起来像这样:
template <class InputIterator>
void Object::add(InputIterator first, InputIterator last) { ... }
Run Code Online (Sandbox Code Playgroud)
虽然这允许调用者从任意容器传递字符串,但它并不表示迭代器必须是一对字符串迭代器的事实.
在这种情况下使用模板是否仍然合适,还是应该强制调用者使用预定的字符串容器?
不幸的是,C++目前不允许您以简洁的方式编写此类信息.
C++ 11应该用概念来解决这个问题,但是由于一些概念(heh)缺陷(据我所知已经解决了),它们在发布之前被淘汰了.
但是你仍然可以使用静态断言和类型特征来提供这样的概念.例如,C++ 11允许编写以下代码:
template <class InputIterator>
void Object::add(InputIterator first, InputIterator last) {
static_assert(
std::is_same<
typename std::remove_cv<
typename std::iterator_traits<InputIterator>::value_type
>::type,
std::string>::value,
"InputIterator must be of iterator type");
…
}
Run Code Online (Sandbox Code Playgroud)
不过,这假定它InputIterator是一个有效的迭代器类型.由于没有特征is_iterator,也没有任何有意义的方法来实现它(据我所知),除非检查输入迭代器的所有必需操作都被遵守,这使得它比理论上要困难得多.
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |