克隆一个类型? 在C++中,两种类型可以具有相同的定义而不属于同一类型。 例如,在这里考虑A和B:
typedef不会创建新类型,它会为同一类型创建新名称, 似乎是这样 天真地说,有人可能会认为一个典型的编译器使用某种类型的编译器 实现基本类型。例如,你可以想象有一些 排序模板uu有符号u整数,然后在一些内部头文件中, 你能找到这样的东西吗克隆一个类型? 在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 __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>;