3

私は次のことができるかどうか疑問に思いました:

template <typename T>
namespace basic_foo {
    struct str {
        T value;
    };
}

basic_foo<char>::str s1;
namespace foo = basic_foo<char>;
foo::str s2;

これを任意のC++コンパイラで実行することは可能ですか?
これを実装するために行われている作業はありますか?
それは言語への素晴らしい追加になると思います。

前もって感謝します。

4

4 に答える 4

10

いいえ、名前空間テンプレートを定義することはできません。basic_fooただし、クラス テンプレートを作成することで、(わずかに異なる構文で) ほぼ正確に目的を達成できます。

template <typename T>
struct basic_foo {
    struct str {
        T value;
    };
};

basic_foo<char>::str s1;
typedef basic_foo<char> foo;
foo::str s2;
于 2012-07-06T16:45:37.540 に答える
5

いいえ、ただし、テンプレート化された構造体を使用できます:

template<typename T>
struct basic_foo
{
    struct str
    {
        T value;
    };
};

typedef basic_foo<char> foo;
foo::str s1;

classの代わりに を使用することもできますが、その場合structは について覚えておく必要がありますpublic:

于 2012-07-06T16:45:48.493 に答える
1

名前空間テンプレートは非現実的ですが、クラス テンプレートを作成することはできます。

于 2012-07-06T16:46:15.567 に答える
0

他の回答は、あなたが望むように見えることを行う方法を説明しています。しかし、名前空間が実際に設計されているものとは異なる目的で使用されているようです。

名前空間は、2 つの無関係な C++ コード ベースが互いに通信できるという問題を解決します。C には名前空間がなく、その結果、はるかに冗長になります。C で openssl や oauth などのサードパーティ ライブラリを使用してみてください。次のような関数呼び出しが多数見つかります。

openssl_create
openssl_connect

等々。そして、これは本当に、本当に重要です。可能性があるので、 という関数を書きたいと思いますconnect。私が使った ZMQ ライブラリの作者もそうです。などなど。そして、同じ場所で呼び出されようとしている同じ名前の 2 つの関数を持つことは、非常に大きな苦痛です...

名前空間は純粋にソフトウェア エンジニアリングの構造であり、プログラミングの構造ではありません。これにより、プレフィックスがopenssl_単純に名前空間になるため、上記のようなコードをより自由に混在させることができます。名前空間が競合しないのはなぜですか? これは、ソフトウェア エンジニアリングがさらに人間的かつ社会的になる場所です。基本的に、グローバル プログラミング コミュニティは、これが起こらないようにする必要があります。通常、外側の名前空間は会社です。Google の内部コードはすべて namespace にあると思いますGoogle。Java は、インターネット ドメイン名によるパッケージ (名前空間など) の命名規則を促進することでこれを解決します。これはおそらく、競合することのない実世界のエンティティです。たとえば、Google コードはパッケージ内に存在する必要があります。com.google...

また、組織内では名前空間がアプリケーション、製品、またはチーム レベルで使用されることに注意する必要があります。たとえば、Google ドライブには、おそらく Google Mail と同様に「アップロード」機能がどこかにあり、それらのチームは通常、互いに会話しない可能性があります。 . ただし、混在するコードを記述する必要があります。それが名前空間の機能です。それ以上でもそれ以下でもありません。

于 2012-07-06T19:26:48.440 に答える