使相同的C ++类型别名不兼容

呼叫:

我使用std::vector<int>两种不同的信息。我想确保我不会意外地将两种用途混合使用。

简而言之,我想使这段代码失败:

#include <vector>

using A = std::vector<int>;
using B = std::vector<int>;

void fa(const A&);
void fb(const B&);

void fun()
{
    A ax;
    B bx;

    fa(bx);
    fb(ax);
}

即使fa期望类型为的参数,该代码也会编译A显然,A并且B是相同的。

使此代码正确编译的最简单方法是什么:

fa(ax);
fb(bx);

并使此代码失败:

fa(bx);
fb(ax);

当然,我可以包装std::vector<int>在另一个类中,但是随后我需要重写其接口。或者,我可以从继承std::vector<int>,但是通常不建议这样做。

简而言之,我需要两个不兼容的版本std::vector<int>

编辑

已经提出,强类型定义可以解决此问题。这只是部分正确。如果使用BOOST_STRONG_TYPEDEF(std::vector<int>, A),我需要添加一些烦人的演员表。例如,代替

A ax{1,3,5};

我需要用

A ax{std::vector<int>{1,3,5}};

而不是

for (auto x : ax) ...

我需要用

for (auto x : (std::vector<int>)ax) ...
Christoph Diegelmann:

我认为您想要的仍然可以通过以下方式获得最佳实现:

struct A : public std::vector<int>{
  using vector::vector;
};
struct B : public std::vector<int>{
  using vector::vector;
};

它正是您想要的。没有理由仅仅为了避免发表明确声明而提出一些丑陋的黑客手段。我看到不喜欢这种子类型的主要原因是,相同的事物应表现为相同的事物,并且可以互换使用。但这正是您要抑制的内容,因此对它进行子类型化即可准确地表达所需的语句:它们具有相同的接口,但不应使用相同的接口,因为它们不相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类型别名与类型相同

C ++中函数参数的类型别名

TypeScript如何区分引用相同类型的类型别名

C ++中严格的别名规则和类型别名

C ++别名相同的类型

是否可以在C ++中获得类型别名的名称?

通过类型别名实现C ++不变性

typedef和C ++ 11类型别名之间的区别

C#基本类型别名的结构开销?

C ++ 11“使用”类型别名的默认模板参数

C ++:类型别名中的递归依赖性

创建一个C#Func <>类型别名

通用类型别名,它们互不兼容

列表的类型别名在擦除后结果为相同类型

使用模板别名(类型别名,使用C ++ 11)弃用模板化的类名吗?

约束的类型别名与上下文没有共享相同的变量绑定行为

C不兼容的指针类型消息似乎列出了预期和实际的相同指针类型

Scala类型别名破坏了类型兼容性

为什么“类型别名”是在另一个模块中以相同方式定义的类型?

我可以使用相同的名称为周围范围中的类型声明成员类型别名吗?

具有运算符的std :: array的C ++ 11类型别名

如何在C ++ 11中访问可能不存在的类型别名?

我可以在C ++ 20的类型别名中使用条件吗?

C++0x 中的类型别名有什么替代方法吗?

为什么C ++中的类型别名在其语法中使用“ using”而不是“ typedef”?

C ++概念精简版和类型别名声明

C ++类型别名错误:“使用”之前应有预期的unqualified-id

如何在Objective-C代码中重用Swift类型别名

测试专业化时,c ++类型别名不起作用