0

次のようなものがある場所で問題が発生しました。

#define A_BODY printf("b is %s and c is %d, typeless! :3\n", b, c);
#define B_BODY return "test";
#define C_BODY return 42;

たとえば、それぞれの型で a(b(), c()) を呼び出すコードを作成する必要があります。

C++14 では、これを簡単に行うことができます。

template<typename B, typename C> auto a(B &&b, C &&c) {
  A_BODY
};
auto b() {
  B_BODY
};
auto c() {
  C_BODY
};

int main() {
  auto _b = b();
  auto _c = c();
  auto _a = a(_b, _c);

  return 0;
};

望ましい結果を達成しています... C++ 11で同じ結果を得る方法はありますか? :'(

また、それらは相互に再帰的に呼び出すことができるため、ここでの単純な順序付けも役に立ちません。

編集

私は自分の状況をよりよく説明しようとします。

たとえば、次のような入力ファイルを取得しました。

a is b c {
  printf("b is %s and c is %d\n", b, c);
  if(c > 42)
    printf("c is bigger than the truth!\n");
  return strlen(b) + c;
};
b is {
  return "test";
};
c is {
  return 42;
};

そして、それらを適切に呼び出すことができる C++ コードを生成する必要があります。入力ファイルで定義する必要なく、戻り値の型を推測しようとしています。

そこから、*_BODY仕様、パラメータの数、呼び出しの順序を取得できますが、パラメータがどの型になるかはわかりません。たとえば、関数本体の遅延評価を行うには、テンプレート化されたラムダが必要です。

GCC と CLang で C++14 を使用してこれを行うことができますが、これは商用プロジェクトであり、Visual Studio 2012 もサポートする必要があります。回避策がある場合は、回避策を見つけようとしています。:(

4

1 に答える 1