1

それぞれが構造体の (オブジェクトの) 順序を示すメンバーを持つ構造体を作成できるようにしたいと考えています。実行時のオーバーヘッドはなく、コンパイル時に序数を使用できるはずです。

何らかの理由で静的変数がコンパイル時に機能しないため、単純なアプローチは機能しません。

int nextOrdinal() {
  static int ordinal;
  return ordinal++;
}

struct S1 {
  enum ordinal = nextOrdinal();
}

struct S2 {
  enum ordinal = nextOrdinal();
}

現時点では、構造体がどのように作成されるかは重要ではありません。問題は、コンパイル時に状態を保持できないことのようですが、私は正しいですか?

--Boost.units 次元分析に触発されました。

4

2 に答える 2

0

これを行う信頼できる方法はわかりませんが、ソース ファイル内の場所に基づいて並べ替える場合は、次のようにします。

import std.conv;
import std.stdio;

size_t nextOrdinal(size_t line = __LINE__)()
{
    return line;
}

struct S1 {
    enum ordinal = nextOrdinal();
}

struct S2 {
    enum ordinal = nextOrdinal();
}

void main()
{
    writeln(S1.ordinal);
    writeln(S2.ordinal);
}

呼び出すファイルが複数ある場合nextOrdinal、同じ序数値を持つ構造体定義になる可能性があります。ファイル名もエンコードすることを検討してください。

size_t nextOrdinal(string file = __FILE__, size_t line = __LINE__)()
{
    size_t res;

    foreach (ch; file)
        res += ch;

    return res + line;
}
于 2012-08-03T17:19:15.003 に答える