簡體   English   中英

C ++基本構造函數問題

[英]C++ basic constructor question

我該如何處理以下情況:

我正在編寫自己的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); 它編譯好並調用適當的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)來確定兩個迭代器之間的距離。

編輯:這是一個2d向量? 或者只是兩個向量? 我回答了這個2d向量。

我該如何處理以下情況

我認為你應該通過刪除float構造函數來處理它。 從閱讀代碼開始,我們不清楚你應該從中得到什么樣的對象。

從閱讀callsite代碼,我沒有理由相信vector2 v2(1, 5); 創建兩個向量的向量,每個向量具有一個值。

就個人而言,我本以為它會創建一個1x5矩陣。

如果這是庫的常見用例,請考慮命名構造函數

vector2 Create2x1(float f1, float f2);

re:ASSERT

ASSERT是一個很好的健全性檢查,但需要你的Iterator支持隨機訪問(或至少減去查找距離)。 這可能會過度限制其使用。 考慮使用std::distance或檢查local_vector_storage之后的大小為2。

在特定情況下,我看不到介紹Vector2(Iterator begin, Iterator end) c'tor的意義。

一般來說,當Vector2的維度固定並且永不改變時,我認為模仿std::vector (它本質上是數組的包裝器)是沒有意義的。 std::vectorVector2之間的用例重疊可忽略不計: std::vector通常從另一個容器初始化,而Vector2將用兩個值或另一個Vector2初始化為50/50。

即使你決定繼續,行:

ASSERT(end - begin == 2);

會極大地限制構造函數的有用性,因為相對較少的迭代器支持算術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM