3
/** This is struct S. */
struct S(T) {

  static if(isFloatingPoint!T)
  {
    /// This version works well with floating-point numbers.
    void fun() { }
  }
  else
  {
    /// This version works well with everything else.
    void fun() { }
    /// We also provide extra functionality.
    void du() { }
  }
}

でコンパイルするとdmd -D、ドキュメントは最初のブロックに対してのみ生成されます。elseブロックに対しても生成するにはどうすればよいですか?

4

1 に答える 1

3

ブロックの場合version、ドキュメントに記載されるのは使用されるバージョンのみです(最初のバージョンか最後のバージョンか、またはその間のいずれか)。したがって、たとえば、versionLinux用のブロックとWindows用のブロックがある場合、コンパイルするシステムに一致するものだけがドキュメントに表示されます。

static ifテンプレートの外側のブロックも同じように機能するようです。それらがコンパイルされている場合、それらのddocコメントはドキュメントに含まれますが、コンパイルされていない場合、それらはコンパイルされません。

ただし、テンプレートstatic ifのブロックは、常に最初の静的ifブロックからドキュメントを取得しているように見えます。ただし、これらの静的ifが(テンプレートのさまざまなインスタンス化から)との両方になる可能性があり、コンパイラーは、ddocコメントが生成されたドキュメントに含まれるようにテンプレートをインスタンス化する必要がないことを考慮すると、それは理にかなっています。テンプレート外のブロックのように正しい答えは1つありません。falsetruefalsestatic if

とにかく、ドキュメントをversionブロック内に配置することは一般的に悪い考えstatic ifです。条件付きコンパイルを使用していて、コンパイルされる場合とされない場合があるためです。解決策はversion(D_Ddoc)ブロックを使用することです。したがって、次のような結果になります。

/// This is struct S
struct S(T)
{
    version(D_Ddoc)
    {
        /// Function foo.
        void fun();

        /// Extra functionality. Exists only when T is not a floating point type.
        void du();
    }
    else
    {
        static if(isFloatingPoint!T)
            void fun() { }
        else
        {
            void fun() { }
            void du() { }
        }
    }
}

fooまた、あなたがやろうとしていたことがうまくいったとしても、まったく同じ署名で異なるコメントで2回そこにたどり着いたので、ドキュメントでは非常に奇妙に見えることにも注意してください。はドキュメントにまったく含まれないため、どのような状況で存在したstatic ifかを知る方法はありません。どういうわけか2回foo宣言したように見えます。foo

状況はテンプレートの制約と似ています。制約はドキュメントに記載されていないため、制約によってのみオーバーロードされるテンプレート化された関数を処理する場合、各関数のオーバーロードを文書化することは意味がありません。

ただし、必要のない場所の1つversion(D_Ddoc)は、一連のversionブロックで同じ機能を使用している場合です。例えば

/// foo!
version(linux)
    void foo() {}
else version(Windows)
    void foo() {}
else
    static assert(0, "Unsupported OS.");

ddocコメントは、どのversionブロックがコンパイルされているかに関係なく、生成されたドキュメントに表示されます。

version(D_Ddoc)ブロックを使用すると、ブロックを使用する傾向があることに注意してください。を使用する場合-D、ドキュメントを生成する以外の目的でコードをコンパイルすることは意味がなく、実行する実際の実行可能ファイルは、別のビルドで生成する必要があります。 tを使用します-D。それを回避するために完全なコードをブロックに入れることができversion(D_Ddoc)ますが、それはコードの複製を意味し、実際にはでは機能しませんstatic if。Phobosはversion(StdDdoc)代わりに(それ自体で定義する)を使用するため、ブロックをversion(D_Ddoc)使用しない場合でも、Phobosでversion(D_Ddoc)コンパイルして動作させることができますが、使用を開始すると、ドキュメントとは別にドキュメントを生成する必要があります。通常のビルド。-Dversion(D_Ddoc)

于 2012-09-22T18:56:20.247 に答える