7

C++ のテンプレートには、関数のテンプレートに引数として値を渡すことができる機能があります。C#で同じことを行うにはどうすればよいですか?

たとえば、次のようなことをしたいと思います。

template <unsigned n> struct Factorial {
     enum { 
        result = n * Factorial<n - 1>::result;
     };
};
template <> struct Factorial<0> {
      enum {
        result = 1;
      };
};

しかしC#で。これどうやってするの?

ところで、私が実際にそれらを必要としているのは、必要に応じて (いくつかの静的な値を変更して) クラスを生成する必要があるため、提示されたコードは単なる例です。

4

3 に答える 3

5

その点で、C# ジェネリックは C++ テンプレートとは異なります。それらは値ではなく型でのみ機能します。

于 2013-08-20T00:16:53.383 に答える
4

しかしC#で。これどうやってするの?

ところで、私が実際にそれらを必要としているのは、必要に応じて (いくつかの静的な値を変更して) クラスを生成する必要があるため、提示されたコードは単なる例です。

ダニエルが説明したように、これはジェネリックでは不可能です。

考えられる代替手段の 1 つは、T4 テンプレートを使用することです。必要に応じて、コンパイル時にテンプレートに基づいてクラスを生成できる可能性があります。これは、ニーズを満たすように思えます。

于 2013-08-20T00:28:36.957 に答える
0

コードが実行時に行うべきことをコンパイラに行わせようとしています。

はい、これは C++ で可能です。C# では、そうではありません。C# のコードは次のようになります。

public class Factorial
{
    public static ulong Compute(ulong n)
    {
        if (n == 0)
            return 1;
        return n * Factorial.Compute(n - 1);
    }
}

静的コードはすでに OOP 原則に違反していますが (必要な場合もあります)、値ベースのテンプレートを使用することはさらに悪いことに注意してください。型は他の型に依存する必要があります。これは、ジェネリックを使用して可能です。具体的な値に依存するべきではありません。

于 2013-08-20T01:46:01.957 に答える