正如标题所示,我如何制作任意类型的副本,但与原始类型不同?同样,它们不能隐式地相互转换,但具有相同的接口。
我将以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的类型嵌入。)
答案 0 :(得分:3)
我可以想到几种方法来做到这一点。两者都使用strongly typed typedef
s。
第一种方法假定您能够定义主类,它可以是类模板而不是类。
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.
}