2016-01-11 13 views
16

使用する宣言で、別の名前で関数名にアクセスできるようにするという技術的な理由はありますか?

using bar::f; // in foo 

経由foo::fなど、すべてのfoo::bar::fがアクセスできるようにすることができfoo

namespace foo 
{ 
    namespace bar 
    { 
    void f(); 
    void f(int); 
    } 
} 

を考えてみましょうfoo::g

など、すべての foo::bar::fにアクセスできるようになり、構文が存在しないための技術的な理由があります
using bar::f as g; 
// or in line with using declarations for types: 
using g = bar::f; 

このようなものは考慮されていても拒絶されましたか? (なぜ?)

+5

回避策: 'auto g = [](auto ... args){foo :: bar :: f(std :: forward (args)...); }; ' –

+0

@KerrekSB:' f'よりはるかに多く一致する 'g'を紹介します。 – Pixelchemist

+1

@ Pixelchemistまあ、それを回避するためにSFINAEを採用することができます。 – Columbo

答えて

23

N1489を参照してください:

我々がこれを行うことから、十分な 利益を見ることができていないなどの関数、変数に型と 名前空間を超えて別名の概念を一般化することが可能です重大な過度使用を想像して、どの関数と変数が使用されているのかを混乱させる したがって、 このセクションで説明した一般化は提案しません。 さらに、これらの一般化については、 を参考にする予定はありません。

+0

言い換えれば、 'using'は単なる型を意図しています。技術的理由は、濫用/過度使用の恐れです。 – einpoklum

+0

@einpoklum技術的な理由(障害物)はありません。 – Columbo

10

私は、これが存在しないという技術的な理由を考えることはできません。適切な(衝突しない)構文と非常に重要なユースケースの問題だと思います。

現在、standards proposalは、の不透明なtypedefをサポートするために、言語に関数別名を追加するためにです。その紙によると、機能は以前に90年代初頭に考えられているが、拒否されました:

Stroustrup氏が原因名前の衝突を解決する文脈で、「名前の変更」機能としての彼のD & Eブックで[機能の別名]を説明しました の継承には複数の意味があります。「この概念のセマンティクスは単純で実装は簡単です。彼はそのような提案が「1990年にシアトルの標準会議で に提示された」と述べているが、当初は「大多数の 大部分があった」が、その機能は最終的には採用されていない: "次の会合では、。 。 。 。次のように我々はそのような 名前の衝突が別の言語機能を保証するのに十分な共通なさそうだったことに合意した」

提案構文は次のとおりです。

template< class RA, class R = std::less<> > 
void 
sort(RA b, RA const e, R lt = {}) 
{ 
    using operator<() = lt; // operator < has type R 
    // Remaining code in this scope uses infix < in place of calls to lt(). 
    // (A future proposal may suggest synthesis of other relational 
    // operators from an operator< declared in this fashion.) 
} 

おそらく、最近の標準化会議に出席し、誰かが重量を量ることができ提案に対する反応は何であったのか。

+1

https://isocpp.org/blog/2015/11/kona-standards-meeting-trip-report "不透明タイプ(P0109R0)。問題が解決するにはあまりにも複雑すぎるために却下されました。 " – bolov

関連する問題