Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
克隆一个类型? 在C++中,两种类型可以具有相同的定义而不属于同一类型。 例如,在这里考虑A和B:_C++_Templates_Types_Typedef_Substitution - Fatal编程技术网

克隆一个类型? 在C++中,两种类型可以具有相同的定义而不属于同一类型。 例如,在这里考虑A和B:

克隆一个类型? 在C++中,两种类型可以具有相同的定义而不属于同一类型。 例如,在这里考虑A和B:,c++,templates,types,typedef,substitution,C++,Templates,Types,Typedef,Substitution,typedef不会创建新类型,它会为同一类型创建新名称, 似乎是这样 天真地说,有人可能会认为一个典型的编译器使用某种类型的编译器 实现基本类型。例如,你可以想象有一些 排序模板uu有符号u整数,然后在一些内部头文件中, 你能找到这样的东西吗 typedef __signed_integer<4> int; typedef __signed_integer<4> long; 但是没有写两次定义,而是写一些 struct A { int foo; int bar;

typedef不会创建新类型,它会为同一类型创建新名称, 似乎是这样

天真地说,有人可能会认为一个典型的编译器使用某种类型的编译器 实现基本类型。例如,你可以想象有一些 排序模板uu有符号u整数,然后在一些内部头文件中, 你能找到这样的东西吗

typedef __signed_integer<4> int;
typedef __signed_integer<4> long;
但是没有写两次定义,而是写一些

struct A {
  int foo;
  int bar;
};

typedef clone<A> B;

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


我没有特别的用途,这只是一种好奇心。

你可以简单地继承:

struct A {
  int foo;
  int bar;
};

struct B : A{};

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

您可以简单地继承:

struct A {
  int foo;
  int bar;
};

struct B : A{};

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

您可以为此使用模板:

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

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

这样一来,A和B是不同的类型,但它允许您在不重复定义的情况下制作任意数量的产品。

您可以使用模板:

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

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

这样一来,A和B是不同的类型,但它允许您在不重复定义的情况下创建任意数量的类型。

使用typedef,您不复制任何类型,即使复制周围有引号,您只需创建别名,即为同一实体创建另一个名称。typedef做的事情不对吗?这到底是什么意思?您期望的正确的事情是什么?为什么要克隆类的定义?您最多只想克隆对象。@nbro我已经需要这样的类型克隆,例如,在boost::msmRelated to With typedef中定义不同但相似的状态。您不复制任何类型,即使复制周围有引号,您也只需为同一实体创建别名。typedef做得不对吗?这到底是什么意思?您期望的正确的事情是什么?为什么要克隆类的定义?您最多只想克隆对象。@nbro I已经需要这样的类型克隆,例如,在boost::MSM中定义不同但相似的状态。与此相关的缺点是,如果没有共享基类型,这些都是不相关且不可转换的,除非您显式提供转换操作。@πάνταῥεῖ: 正如我所理解的,OP的缺点似乎是预期的行为:它们是不同的类型。缺点是,如果没有共享的基类型,它们都是不相关且不可转换的,除非您显式地提供转换操作。@πάνταῥεῖ: 缺点似乎是OP的预期行为,据我所知:它们是不同的类型;B B;fb;会起作用,因为B是aA@Jarod42不知道你的意思,这是对雅克现在删除的评论的回复吗?不,这是给你的评论。我说过A和B是相关的类型。@Jarod42我明白了。这实际上取决于OPBut void fconst A&需要哪一级别的类型关系/差异性;B B;fb;会起作用,因为B是aA@Jarod42不知道你的意思,这是对雅克现在删除的评论的回复吗?不,这是给你的评论。我说过A和B是相关的类型。@Jarod42我明白了。这实际上取决于OP需要哪一级别的类型关系/差异性
#include <type_traits>
#include <utility>

struct A {
  int foo;
  int bar;
};

template <typename T>
struct clone : public T
{
   using T::T;
   template<typename ...Ts>
   clone(Ts&&...ts):T{ std::forward<Ts>(ts)... } {};
};

using B = clone<A>;

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

int main()
{
    A a{1,2};
    B b{1,2};
}
template <int>
struct foobar {
  int foo;
  int bar;
};

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