C++基本构造函数问题

标签 c++ constructor templates vector

我应该如何处理以下情况:

我正在编写自己的 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/

相关文章:

C++ 将隐式构造限制为特定值

templates - 使用golang模板打印以逗号和 "or"分隔的列表

c++ - 如果已知,则使用编译时常量

c++ - 当 model_completion 设置为 false 时 Z3 会返回什么?

c++ - vector.back() 和 vector.end() 有什么区别?

c++ - 为什么我在编译模板类时遇到问题?

c++ - 如何指定Qt插件构造函数?

c# - 最佳实践 - 在派生类中设置继承变量

c++ - 对基类成员数据的派生模板类访问

C++ 无法引用 map 的键