代码之家  ›  专栏  ›  技术社区  ›  Jon Purdy

在C++中使所有类型默认为常数

  •  14
  • Jon Purdy  · 技术社区  · 14 年前

    向编译器指示的最简单和最不显眼的方法是什么,无论是通过编译器选项, #define S typedef 或者模板,每次我说 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);
    
    5 回复  |  直到 10 年前
        1
  •  11
  •   stusmith    14 年前

    以开源C++编译器为例,对其进行修改。

    我认为最主要的原因是人们认为你试图修改C++。告诉他们你正在创建一种新的语言“c-const”作为一个大学项目。

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

        2
  •  2
  •   Mike Kale    14 年前

    即使你能做到这一点(我怀疑你没有),也要考虑其他人阅读你的代码。他们不太可能理解所有东西都是常量,因此不太可能理解您的代码。

        3
  •  1
  •   MtnViewMark    14 年前

    你是想告诉编译器,还是告诉其他人阅读或使用你的代码?编译器不会因为使用了用户定义的类型而做任何不同的事情 const . 实际上,它所做的只是更改可用于该对象的方法集(用户定义的或隐式的)。反过来,那 可以 允许编译器推断运行时表示的某些优化。

    对于 class / struct 类型,您只需使每个成员常量:

    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!
    }
    
        4
  •  0
  •   Tobias Langner    14 年前

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

    请添加const修饰符plain visible for everyone where it's needed.你的代码将更经常地被阅读,然后它将被写!

        5
  •  0
  •   Alex Jasmin    10 年前

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

    空的可变宏可以作为 施工检查员 . 在某些地方仍然需要显式常量来编译代码。