gpt4 book ai didi

c++ - 如何复制一个类型?

转载 作者:行者123 更新时间:2023-11-27 23:53:25 25 4
gpt4 key购买 nike

如题,如何复制任意类型,但与原类型不同?如前所述,它们不能相互隐式转换,但具有相同的接口(interface)。

我将以 cuda 的指针为例来解释为什么可能需要这样做。由于主机(CPU)和设备(GPU)内存是分开的,因此您想要在主机代码中取消引用设备指针的机会完全为 0。但是,两者都只是普通的旧指针,如果您确实这样做了,编译器不会提示。这就是类型检查自然适合的地方,这些都是编译时知识。

但是,要创建一个新的指针类型,我必须手动将所有指针算法键入一个类中才能实现。

template<typename T>
class dptr
{
//...
dptr& operator++();
//...
auto& operator*();
//...
bool operator==(dptr) const;
//...
operator bool() const;
private:
T* ptr;
};

当要复制的类型更加复杂并且加入 noexcept 时,样板文件会变得更糟。

我正在寻找的基本上是 Go 所拥有的:任意类型的强重键入

type Int int

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

最佳答案

我可以想到几种方法来做到这一点。两者都使用 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.
}

关于c++ - 如何复制一个类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44462952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com