我应该如何处理以下情况:
我正在编写自己的 2D vector 类并具有以下代码:
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);
,它可以正常编译并调用适当的 float 构造函数。
但是如果我写 Vector2 v(3, 4);
它会失败,因为模板化迭代器构造函数 “更适合” 和 Vector2(Iterator(3) , Iterator(4))
被调用。
遇到这种情况我该怎么办?
我的想法是引入 assign(It1, It2)
成员方法而不是构造函数,但也许有更好的解决方案?
编辑:
此外,您如何看待 ASSERT(end - begin == 2)
行?我知道这意味着我不能,例如,传递 std::list
的迭代器,但会带来额外的安全性。我应该这样做还是不这样做?
最佳答案
这样的事情似乎可行:
template<typename T>
struct notnumeric {typedef int OK;};
template<>
struct notnumeric<int> {};
class Vector2
{
public:
Vector2(float x, float y)
{
}
template <typename Iterator>
Vector2(Iterator begin, Iterator end, typename notnumeric<Iterator>::OK dummy = 0)
{
}
};
我相信它使用 SFINAE 来防止编译器为非数字类型选择第二个 ctor。
至于 ASSERT (end - begin == 2)
,我认为你应该使用 std::distance(begin, end)
来确定两个之间的距离迭代器。
关于C++基本构造函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3205242/