14

无论是通过编译器选项、#defines、typedefs 还是模板,每次我说T我的意思时,向编译器指示的最简单和最不突兀的方式是T const什么?我宁愿不使用外部预处理器。由于我不使用mutable关键字,因此可以接受将其重新用于指示可变状态。

编辑:由于这样做的意图完全是错误的(并且由于我没有几个小时来澄清),让我解释一下。本质上,我只想知道哪些系统可用于在编译时操作类型系统。我不在乎这是否会创建非标准、糟糕、不可维护、无用的代码。我不会在生产中使用它。这只是一种好奇心。

迄今为止的潜在(次优)解决方案:

// I presume redefinition of keywords is implementation-defined or illegal.
#define int int const
#define ptr * const
int i(0);
int ptr j(&i);

typedef int const Int;
typedef int const* const Intp;
Int i(0);
Intp j(&i);

template<class T>
struct C { typedef T const type; typedef T const* const ptr; };
C<int>::type i(0);
C<int>::ptr j(&i);
4

5 回答 5

13

使用开源 C++ 编译器并对其进行修改。

我认为反对的主要原因是人们认为您正在尝试修改 C++。相反,告诉他们您正在创建一种名为“C-const”的新语言作为大学项目。

我个人认为这是一个有趣的想法——你可以从不可变类型中获得各种性能和可读性——只要看看大多数函数式语言。

于 2010-05-04T11:29:37.153 回答
2

即使您能够做到这一点(我怀疑您不是),也要考虑其他人阅读您的代码。他们不太可能理解一切都是 const 的,因此不太可能理解您的代码。

于 2010-05-04T05:36:09.853 回答
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!
}
于 2010-05-04T05:27:31.017 回答
0

我建议不要这样做。如果你设法实现了你的目标,任何人(包括一段时间后的你)在阅读你的代码时都会感到惊讶,并且它的行为与他预期的不同。

请在需要的地方添加对所有人可见的 const 修饰符。您的代码将被更频繁地阅读,然后将被编写!

于 2010-05-04T05:36:49.463 回答
0

您可以保持代码标准 C++ 并设计一个额外的类型检查层。

一个空的 MUTABLE 宏可以作为const checker的提示。在使代码编译的地方可能仍需要显式 const。

于 2014-10-08T05:36:27.197 回答