gpt4 book ai didi

c++ - 克隆类型?

转载 作者:行者123 更新时间:2023-11-30 00:46:23 24 4
gpt4 key购买 nike

在 C++ 中,两种类型可以具有相同的定义,但不是同一类型。

例如,这里考虑AB:

struct A {
int foo;
int bar;
};

struct B {
int foo;
int bar;
};

static_assert(!std::is_same<A, B>::value, "");

AB 在某种意义上是可以互换的,如果我有一个程序仅使用 A,并将 A 的每个实例替换为 B,它将编译并以同样的方式工作。如果您愿意,它们在“鸭子打字”的意义上是相同的,但并不完全相同。

某些基本类型似乎会发生类似的事情。

当我在我的 32 位机器上编译 C++ 程序时,我发现 intlong 都代表一个带符号的 32 位整数,并且可以互换,而不是同类型。


这与我使用 typedef“复制”类型时发生的情况不同。

struct A {
int foo;
int bar;
};

typedef A B;

static_assert(std::is_same<A, B>::value, "");

typedef 不会创建新类型,它会为同一类型创建一个新名称,看来。


天真地,人们可能会想象一个典型的编译器使用某种编译器内在实现基本类型。例如,您可能会想象有一些某种模板 __signed_integer,然后在一些内部头文件中,你会发现这样的东西

typedef __signed_integer<4> int;
typedef __signed_integer<4> long;

并且在不同的实现上会有所不同。

然而,由于 typedef 没有做正确的事情(intlong 应该是不同,即使它们具有相同的大小),这实际上不可能是它有效 - 必须有一些其他机制。


这个问题实际上与编译器实现细节无关:相反,问题是,在用户级标准 C++ 中是否有一种方法可以“typedef”一个类型以制作拷贝而不是别名的方式?

即有没有办法获得与代码相同的效果:

struct A {
int foo;
int bar;
};

struct B {
int foo;
int bar;
};

static_assert(!std::is_same<A, B>::value, "");

但是没有写两次定义,而是写一些类似的东西

struct A {
int foo;
int bar;
};

typedef clone<A> B;

static_assert(!std::is_same<A, B>::value, "");

?

(我没有特别的用途,这只是好奇。)

最佳答案

您可以为此使用模板:

template <int>
struct foobar {
int foo;
int bar;
};

using A = foobar<1>;
using B = foobar<2>;

这样一来,AB 是不同的类型,但它允许您根据需要创建任意多个,而无需重复定义。

关于c++ - 克隆类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38805468/

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