2010-12-06 9 views
0

ヘッダファイル:C++に 'ブロックを使用する'構文を追加すると、どのような問題が発生しますか?このような宣言と

void FooBar(System::Network::Win32::Sockets::Handle handle, System::Network::Win32::Sockets::Error& error /*, more fully-qualified param declarations... */);

は、特定のフレームワークでは一般的です。 この問題を緩和できる宣言を使用すると、ヘッダーファイル であるヘッダーファイルの名前ルックアップ規則に影響するため、ヘッダーファイル で使用することは一般的にコーシャーとはみなされません。プライベート宣言されているクラス内のtypedefは、クラスのネームスペースとそれから派生したクラスのネームスペースである を混乱させます。特別な方法で処理されているJavaやPythonの個々のファイルで

using { 
    // A 'using' block is a sort of way to fence names in. The only names 
    // that escape the confines of a using block are names that are not 
    // aliases for other things, not even for things that don't have names 
    // of their own. These are things like the declarations for new 
    // classes, enums, structs, global functions or global variables. 
    // New, non-alias names will be treated as if they were declared in 
    // the scope in which the 'using' block appeared. 

    using namespace ::std; 
    using ::mynamespace::mytype_t; 
    namespace mn = ::mynamespace; 
    using ::mynamespace::myfunc; 

    class AClass { 
    public: 
     AClass(const string &st, mytype_t me) : st_(st), me_(me) { 
     myfunc(&me_); 
     } 

    private: 
     const string st_; // string will refer to ::std::string 
     mn::mytype_t me_; 
    }; 
// The effects of all typedefs, using declarations, and namespace 
// aliases that were introduced at the level of this block go away 
// here. typedefs and using declarations inside of nested classes 
// or namespace declarations do not go away. 
} // end using. 

// Legal because AClass is treated as having been declared in this 
// scope. 
AClass a("Fred", ::mynamespace::mytype_t(5)); 

// Not legal, alias mn no longer exists. 
AClass b("Fred", mn::mytype_t); 

// Not legal, the unqualified name myfunc no longer exists. 
AClass c("Fred", myfunc(::mynamespace::mytype_t(5)); 

:ここ

は、提案されたソリューションです。他の名前空間の名前をファイルに挿入するインポート宣言を持つことができます。これらの名前は(まあまさにPythonではなく、ここで説明するにはあまりにも複雑ですが)そのファイル内でしか見えません。

私はC++にも同様の構造が必要だと思います。プリプロセッサ、#includeディレクティブ、および翻訳単位のC++コンセプトの存在により、インポートされた名前の暗黙のスコープが問題になります。だから私は、そのような一時的なエイリアスを明示的にスコープするためのいくつかのメカニズムが必要だと思います。

このアイデアでは、どのような問題が予想されますか?問題がない場合、または問題が非常に小さく修正可能な場合は、標準委員会の提案としてどのように提出するつもりですか?

+6

C++を修正する場合は、 '#include'を廃止して、適切なモジュールシステムを導入してください。 – delnan

+0

@delnan - 私は同意しません。私は、Javaのモジュールシステムが非常に刺激的で、場合によっては多少問題があることを知っています。暗黙のファイルスコープが問題だと思います。私は '#include 'を取り除くのは巨大なプロジェクトだと思うし、それが起こる前に何かが正気に必要だと思う。 – Omnifarious

+0

適切な/良いモジュールシステム>>> shittyモジュールシステム>いくつかの問題を解決するためのプリプロセッサと新しい言語構造。 (また、私は完全に深刻ではない) – delnan

答えて

3

ISO/IEC JTC1/SC22/WG21(別名C++)標準委員会は、C++0x規格の終了に近づいています。あなたは本質的にC + + 0x標準にこの提案を得るチャンスはありません。

任意の提案について、その特権のために競合する他の50個の提案ではなく、標準に追加する理由を説明してください。 (EのStroustrupの説明を参照してください。

また、実用的で実用的なインプリメンテーションを持つことで、実践的な体験を得ることができます。それは抽象的で実装されていないままですが、exportの失敗を繰り返す危険性があり、委員会はその反復を避けようとします。これの利点の1つは、あなたの機能を使用することに関心のある人々の選挙区を構築するのに役立つということです。あなたがそのような支持者を築くことができないなら、あなたの提案は標準に含める価値がないかもしれません。

あなたがここに書いたことは興味深いスタートかもしれませんが、標準的な提案になるのに必要なものの近くにはまだありません。オープンスタンダードのWebサイトの文書を見てください。これを前進させるためのリソースがあるかどうかを検討してください。チャンスはあなたがしないということです、私は残念です。

+0

言語のような音はすぐにその態度で時代遅れになるだろう... –

+2

@Zach:どちらの態度?標準化された既存のプラクティス(C89)が成功した基準はその最高の例の1つです。オンザフライで作成できない標準 - SQLがその最良の例の1つです。 C++は、標準化される前に実装されていなかったエクスポートに関する問題に遭遇しました。 D&Eを読んで、Stroustrupがそれについて何を言いたいのかを見てください。私は彼が言っていることを大いに反響しています。 (また、C++のTR1機能はBoostによる実装経験に基づいており、STLは実装経験に基づいていました) –

+0

@Zach:提案を前向きに受け入れることについてのコメントは純粋なプラグマティズムです。標準への提案された変更は、委員会の誰かによって提案され、委員会を通じて運ばれなければならない。無数の変更提案があります。それぞれのメリットで勝つ必要がありますが、メリットを説明し、問題を克服する必要があります。また、委員会に出席して対処できる弁護士が必要です。 –

1

誰もが実装の詳細のために予約している名前空間を持つ方法のような意味ですか?または、クラスにアクセスしたくない場合は、どのようにクラスを使用してメンバーをプライベートにすることができますか?このアイデアが根本的に間違っているか悪いかは分かりませんが、私は利益を見ていません。 C++のコンパイルモデルには、このようなトリビアルではなく、修正が必要な多くの穴があります。

+0

これらを非公開にすると、クラスの名前空間とそのクラスから派生したすべてのクラスが乱雑になります。あなたのクラスから派生したクラスの中で、 ':: std :: string'に対するprivate型定義を持っていたクラスの中で' string'を参照すると、型がアクセス不能であると不平を言うコンパイラで終わるでしょう。詳細な名前空間は少し良いですが、いくつかのヘッダーファイルで同じ名前空間を使用すると、混乱する問題も発生します。 – Omnifarious

+0

@omnifarious:ヘッダーファイルの乱雑な問題については、pimplイディオムを確認してください:http://en.wikipedia。org/wiki/Opaque_pointer – Matthieu

+0

@Matthieu - そのイディオムは素晴らしいですが、 ':: cartoon :: flintones :: fred :: PrePebbles :: Widget'のような型名を持つインターフェースの問題は解決されず、使用する必要があります'Widget'という名前の他の名前空間を汚染しないように、毎回完全修飾名を指定します。 – Omnifarious

3

私は混乱しています。あなたのusingブロックと通常のブロックの違いは、いくつかの名前が出てきて、そのルールがかなり恣意的に見えるということです。人々はあなたが期待していたようなコーナーケースを思いつきます。これが一般的な用途であるかどうかは分かりません。

一意の名前空間といくつかのusing namespace::foo;ステートメントでこれほどのことをすることはできませんか?

これを標準にするためにまずやっておくべきことは、あなたが何をする必要があるかをあなたに知らせるsome C++ committee documentsです。少なくとも、それは良いアイデアとなる理由と、長所と短所を慎重に検討するという、非常に優れた議論になる言語が必要です。

次は、これを実装するコンパイラ(g ++の変更されたバージョン)が出てきて、それを普及させようとすることです。

実際に使用することができれば、現在完成しているのではなく、それ以降の標準に入ることに亀裂があります。あなたが委員会に加わることができれば、新しい特徴はチャンピオンを必要としているので、助けになるでしょう。良いニュースは彼らがあなたを追い出すことができないということです。悪い点は、高価で時間がかかり、しばしば面倒であるということです。

これは多くのように聞こえるかもしれませんが、あなたはそれらに過負荷の言語に別の機能を追加しようとしています。あなたは本当に良い正当化と多くの仕事が必要になるでしょう。

関連する問題