每次我说{{1}时,通过编译器选项,#define
,typedef
或模板向编译器指示的最简单和最不显眼的方法是什么?我的意思是T
?我宁愿不使用外部预处理器。由于我不使用T const
关键字,因此可以接受重新调整以表示可变状态。
编辑:由于此操作的意图错误完全(并且由于我不在几个小时内澄清),让我解释一下。本质上,我只想知道在编译时可以使用哪些系统来操作类型系统。我不在乎这是否会产生非标准,错误,不可维护,无用的代码。我不打算在生产中使用它。这只是一种好奇心。
到目前为止的潜在(次优)解决方案:
mutable
答案 0 :(得分:11)
使用开源C ++编译器并对其进行修改。
我认为downvotes的主要原因是人们认为你正试图修改C ++。告诉他们你正在创建一种名为“C-const”的新语言作为大学项目。
我个人认为这是一个有趣的想法 - 你可以从不可变类型中获得各种性能和可读性 - 只需查看大多数函数式语言。
答案 1 :(得分:2)
即使你能够做到这一点(我怀疑你不是这样),想想其他人阅读你的代码。他们不太可能理解一切都是常量的,因此不太可能理解你的代码。
答案 2 :(得分:1)
您是在试图告诉编译器,还是告诉其他人阅读或使用您的代码?由于使用了用户定义的类型const
,编译器不会做太多不同的事情。实际上,它所做的就是更改可以与该对象一起使用的方法集(用户定义的或隐式的)。反过来,可能允许编译器推断运行时表示的一些优化。
对于class
/ struct
类型,您可以通过简单地使每个成员为const来清除编译器和用户:
class Point {
// An immutable Point data object
public:
Point(int ix, int iy): x(ix), y(iy) { }
Point(const Point& p): x(p.x), y(p.y) { }
Point add(const Point& p) const;
int taxiDistance() const;
// etc... all const members
const int x, y; // const can only be init'd at construction time
private:
Point& operator=(const Point& p); // never implemented!
}
答案 3 :(得分:0)
我会建议不要这样做。如果你设法实现目标,任何人(包括你在一段时间后)在阅读你的代码时会感到惊讶,并且它的行为与他预期的不同。
请在任何需要的地方添加const修饰符plain。你的代码将被更频繁地阅读,然后它将被写入!
答案 4 :(得分:0)
你可以保持代码标准C ++并设计一个额外的类型检查层。
空的MUTABLE宏可以作为 const检查器的提示。在代码编译的地方可能仍然需要显式const。