【问题标题】:make typedefs incompatible使 typedef 不兼容
【发布时间】:2012-02-22 11:23:57
【问题描述】:

情况:

typedef int TypeA;
typedef int TypeB;

我需要使 TypeA 与 TypeB 不兼容(因此任何将 TypeA 分配给 TypeB 的尝试都会触发编译错误),同时保留内置类型(运算符)提供的所有功能。

一种方法是将每种类型包装到单独的结构/类中(并重新定义所有运算符等)。

还有其他更“优雅”的方法吗?

不允许使用第三方库。不支持 C++0x/C++11x。 (支持 C++ 2003)

【问题讨论】:

标签: c++


【解决方案1】:

唯一的方法是创建一个新类型(例如使用BOOST_STRONG_TYPEDEF)。

【讨论】:

  • 好的,现在,Boost 是魔法;但这如何通过对包装类型的成员和方法的访问来传递?
  • @Chowlett 查看 BOOST_STRONG_TYPEDEF 的实现,我看到了they re-implemented all operators
  • 我可以看到从totally_ordered2<...> 继承提供了通过less_than_comparableequality_comparable 访问所有comparison 运算符。但是我看不出,如果我BOOST_STRING_TYPEDEF(std::string, Foo);,那么我可以做到Foo foo = "foo"; foo.length();
  • 我们可能在谈论不同的目的,但这似乎意味着this 应该有效;显然,它没有,那么提升 myFoo.length(); 工作做了什么?
  • @Chowlett 实际上,您需要像在this example中一样访问它
【解决方案2】:

要触发编译器错误,您可以将这两种类型都设为类。在TypeA 中,创建一个与TypeB 相互转换的转换运算符和/或构造函数 - 并使这些方法私有

这样,从TypeBTypeA 的任何转换都会调用转换函数,编译器会发出错误,表明该方法是私有的!确保您可能需要编写少量的转换运算符/构造函数,从/到您希望转换成功发生。我的意思是,如果你想从float 进行转换,你需要编写构造函数以float 等其他类型。

您可以在TypeATypeB 中编写转换运算符、构造函数,以及这些类中允许的转换列表。

【讨论】:

  • 我可以将结果类型与所有运算符一起使用,而无需手动转发它们吗?
猜你喜欢
  • 2018-07-04
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多