14

#defineコンパイラ オプション、 s、 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);
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 チェッカーのヒントとして機能します。コードをコンパイルする場所では、明示的な const がまだ必要な場合があります。

于 2014-10-08T05:36:27.197 に答える