如何制作一个类型的副本?

时间:2017-06-09 16:44:12

标签: c++

正如标题所示,我如何制作任意类型的副本,但与原始类型不同?同样,它们不能隐式地相互转换,但具有相同的接口。

我将以cuda的指针为例来解释为什么可能需要它。由于主机(CPU)和设备(GPU)内存是分开的,因此您希望在主机代码中取消引用设备指针的可能性非常小。然而,两者都只是简单的旧指针,如果你确实这样做,编译器不会抱怨。这是类型检查自然适合的地方,这些都是编译时知识。

但是,为了创建一个新的指针类型,我必须手动将所有指针算法输入到一个类中来实现这一点。

element.ondrop

当要复制的类型更加复杂并且填充template<typename T> class dptr { //... dptr& operator++(); //... auto& operator*(); //... bool operator==(dptr) const; //... operator bool() const; private: T* ptr; }; 时,样板文件会变得更糟。

我所寻找的基本上就是Go所拥有的:对任意类型进行强有力的重新输入

noexcept

type Int int 现在是Int,有算术和所有这些,但不能隐式转换为int。 (实际上,如果读者知道那是什么,我想要的更像是Go的类型嵌入。)

1 个答案:

答案 0 :(得分:3)

我可以想到几种方法来做到这一点。两者都使用strongly typed typedefs

第一种方法假定您能够定义主类,它可以是类模板而不是类。

template <typename Tag>
struct foo
{
   void bar() {}
};

using Type1 = foo<int>;
using Type2 = foo<float>;

int main()
{
   Type1 t1;
   Type2 t2;

   t1.bar(); // OK
   t2.bar(); // OK
   t2 = t1;  // Incorrect.
}

第二种方法类似,但它使用现有的类。它假定您无法修改主类。

// Existing class.
struct foo
{
   void bar() {}
};

// Bar can be used to create strongly typed typedefs.
template <typename Tag, typename Base>
struct Bar : public Base
{
};

using Type1 = Bar<int, foo>;
using Type2 = Bar<float, foo>;

int main()
{
   Type1 t1;
   Type2 t2;

   t1.bar(); // OK
   t2.bar(); // OK
   t2 = t1;  // Incorrect.
}