2015-05-01 29 views
-2

我有一種感覺,我會因爲問這個問題而被灼傷,但是我的C++知識是有限的,而且我正在學習。根據特定類型將特定的移動構造函數注入到任意類型中

是否有一種方法可以隱藏/覆蓋另一種類型T的移動行爲,當目標my_class的實例與其他操作符所做的相似時?

例如:

template<typename T> 
class my_class 
{ 
... 
}; 

std::istream& operator>>(std::istream& is, my_class& c); 

而是與移動分配/移動構造函數。

如果我想在處理my_class的實例時覆蓋類型T的移動(構造或賦值)行爲,這是可能的嗎?這是否需要某種反思,或者是否可以用構造如friend執行,或者只需在全局範圍聲明一個函數,並將這兩種類型都作爲參數?

示例假設T是某種類型的,我想隱藏/覆蓋T的舉動爲建設和分配行爲:

T t; 
t = my_class<T>(...); // move-assign T from my_class rvalue 
T t(my_class<T>(...)); // move-construct T from my_class rvalue 

我假設有人還要問爲什麼在世界上我會想要做這樣的事情,the answer to that question lies in my comments here.

+0

'T T = my_class (...);'和'T T(my_class (...));'兩者都做同樣的事情,而且都沒有任何意義。你想達到什麼目的? – Barry

+0

@Barry一直讀到最後的問題;) 樣,一個叫T的移動賦值運算符,另一個是移動構造函數。我想爲嘗試移動'my_class'的類改變這種行爲。 –

+0

在C++中沒有任何反射,所以不起作用。 – phantom

回答

3

據我所知,你正在嘗試注入一個特定的移動構造函數到任意類型的基礎上你的具體類型。有些語言可以讓你做到這一點,但是C++並不是其中之一。

雖然沒有什麼能阻止你引入你的自己的類型。你可以用任意T和 「注入」 你的舉動構造函數有:

template <typename T> 
struct wrapped 
{ 
    wrapped(my_class<T>&& cls) { 
     // move-construct val as you wish 
    } 

    wrapped& operator=(my_class<T>&& cls) { 
     // move-assign val as you wish 
    } 

    // possibly other constructors? 

    T val; 
}; 

wrapped<T> t(my_class<T>(...)); // uses your move constructor 
+0

不幸的是,對於我的場景,我只是試圖實現與標準庫很好地搭配的不同類型的迭代器,並且如果必須爲標準庫中的每個容器編寫一個「包裝」容器來執行此操作,那麼這真的不值得。 –

+0

你確定你不能這樣做嗎?因爲您可以將其他操作符重載爲任意類型,其中最常見的是移位操作符。所以它不像你和其他人所說的那樣「怪異」。 'std :: istream&operator >>(std :: istream&is,SomeClass & obj);'授予成員類必須將它們表示爲「朋友」。 –

+0

@FranciscoAguilera是的,我敢肯定。你爲什麼不'my_class '只是創建一個'T'? – Barry