2015-05-01 32 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