【发布时间】:2011-03-13 10:12:22
【问题描述】:
我应该如何处理以下情况:
我正在编写自己的 2D 矢量类,并具有以下代码:
class Vector2 : public (...)
public:
Vector2(float x, float y) {
local_vector_storage_[0] = x;
local_vector_storage_[1] = y;
}
template <typename Iterator> Vector2(Iterator begin, Iterator end) {
ASSERT(end - begin == 2);
resize(2);
std::copy(begin, end, local_vector_storage_.begin());
}
// ...
};
现在,如果我说Vector2 v(3.0f, 4.0f);,它可以正常编译并调用适当的浮点构造函数。
但如果我写 Vector2 v(3, 4); 它会失败,因为模板化迭代器构造函数 “更适合” 和 Vector2(Iterator(3), Iterator(4)) 被调用。
在这种情况下我该怎么办?
我的想法是引入 assign(It1, It2) 成员方法而不是构造函数,但也许有更好的解决方案?
编辑:
另外,你觉得ASSERT(end - begin == 2) 线怎么样?我知道这意味着我不能传递 std::list 的迭代器,但会带来额外的安全性。我应该这样做吗?
【问题讨论】:
-
好问题!我只看到三个选项: 1. 使用范围而不是迭代器; 2.添加显式
(int, int)构造函数; 3. 保持原样并要求明确的浮动。您还可以考虑添加独立的工厂函数,例如make_vector。 -
关于
assert的问题:您可以改用std::distance。或者可能只传递一个迭代器,因为无论如何你总是复制恒定数量的元素。 -
local_vector_storage_的类型是什么?我猜这是一些向量,但向量是什么?类本身不是模板,所以向量的类型可能是固定的吧?顺便提一句。你到底想做什么?
-
对于您的断言,您可以使用
std::distance而不是减法,因此它适用于所有迭代器类型。
标签: c++ constructor templates vector