39

特に、この c++ コードに似たコードをコンパイル時に c# で実行することは可能でしょうか?

template <int N>
struct Factorial 
{
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> 
{
    enum { value = 1 };
};

// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
    int x = Factorial<4>::value; // == 24
    int y = Factorial<0>::value; // == 1
}
4

9 に答える 9

35

いいえ、この複雑なメタプログラミングは、C# 言語では直接サポートされていません。ただし、@littlegeekが言ったように、Visual Studio に含まれているText Template Transformation Toolkitを使用すると、複雑なコード生成を実現できます。

于 2008-10-26T06:14:14.080 に答える
34

.NET ではメタプログラミングが可能ですが (コンパイラ コンパイラ、正規表現、コード DOM、リフレクションなどを参照)、C# にはその言語機能がないため、テンプレートメタプログラミングはできません。

于 2012-02-22T10:42:50.610 に答える
7

ほとんどの人は、好きな言語の中からメタプログラミングを試みることを主張します。言語がメタプログラミングをうまくサポートしていない場合、それは機能しません。他の回答では、C#はそうではないことが観察されています。

これを回避する方法は、プログラム変換ツールを使用して、言語の 外部からメタプログラミングを行うことです。このようなツールは、ソースコードを解析し、その上で任意の変換を実行して(メタプログラミングがとにかく行うことです)、改訂されたプログラムを吐き出すことができます。

任意の言語を解析できる汎用プログラム変換システムがある場合は、好きな言語でメタプログラミングを行うことができます。このようなツールについては、 DMS Software Reengineering Toolkitを参照してください。このツールは、C、C ++、Java、C#、COBOL、PHP、およびその他の多くのプログラミング言語に対応し、これらすべてのメタプログラミングに使用されています。

DMSは、ASTとしてプログラム構造に完全にアクセスするための通常の方法とサポートインフラストラクチャを提供し、ほとんどの場合、高度なプログラム操作を行うために必要なシンボルテーブル、タイプ情報、制御、データフロー分析などの追加データを提供するため成功します。

編集(コメントへの応答):C#でOPのタスクを実装するためにDMSを適用できます。

于 2010-02-26T18:19:38.550 に答える
6

Java や .Net 言語を扱う場合、コンパイル時間について話すときは注意が必要です。これらの言語では、「コンパイル時間」(JIT) を「実行時間」の後に延期できるという事実により、C++ よりも強力なメタプログラミング (より広い意味でのリフレクション) を実行できます;)

于 2008-11-11T14:42:18.147 に答える
5

.NET ジェネリックと C++ テンプレートの本質的な違いは、ジェネリックが実行時に特殊化されることです。テンプレートはコンパイル時に展開されます。ジェネリックの動的な動作により、Linq、式ツリー、Type.MakeGenericType()、言語の独立性、コードの再利用などが可能になります。

ただし、代償があります。たとえば、ジェネリック型引数の値に演算子を使用することはできません。C# で std::complex クラスを作成することはできません。また、コンパイル時のメタプログラミングはありません。

于 2008-10-26T14:39:14.340 に答える
5

いいえ、C# ではメタプログラミングはできません。

于 2008-10-26T01:25:43.443 に答える
3

それは可能になるでしょう。Anders Hejlsberg の The Future of C#トークをご覧ください。

于 2009-01-03T16:33:32.947 に答える
3

非常に限られた範囲で、C# はメタプログラミングとして解釈される可能性があります。しかし、実際には過負荷の解決にすぎません。それをメタプログラミングと呼ぶのは、本当にやり過ぎです。

例:

static string SomeFunc<T>(T value) {
    return "Generic";
}
static string SomeFunc(int value) {
    return "Non-Generic";
}

static void Example() {
    SomeFunc(42);           // Non-Generic
    SomeFunc((object)42);   // Generic
}
于 2008-10-26T03:54:19.417 に答える