3

いくつかのサブ関数を呼び出して、これらのサブ関数の結果を返す関数を作成したいと思います。

sub functions:
template<class A> A sub1(A a)
template<class B> B sub2(B b, int i)
template<class C> C sub3(C c, string p)

関数は、switchステートメントでこれらを適宜呼び出します。申し訳ありませんが、問題と混同されてコードを書き始めていないため、疑似コードしかありません。

mf(string s)
{
  int k;
  k = process(s)
  string
  switch (k){
  case 0:
    return sub1(k);
  case 1:
    return sub2(s, k);
  case 2:
    return sub3(k, s);
  default:
    break;
  }
}

現在、リターンタイプがないため、上記のmfをどのように定義できますか?テンプレートをもう一度使用しますか?ちなみに、私のc++コンパイラは私があまり馴染みのないc++11標準をサポートしています。

4

2 に答える 2

3

サブ関数の値を返す関数が必要な場合は、それらすべてに同じ戻りタイプが必要です。

ここに小さな意味のない例があります:

double calculatedPositive(double value)
{
    // Do stuff
}

double calculatedNegative(double value)
{
    // Do stuff
}

double functionA(double value)
{
     if(value > 0)
         return calculatePositive(value);
     else
         return calculateNegative(value);
}

P.-S. あなたが達成しようとしていることを言うなら、私たちはあなたにもっと良い答えを提供することができます;)

于 2012-10-07T03:28:53.543 に答える
3

C ++は基本的に静的型の言語です。つまり、すべての種類の式は、実行時ではなくコンパイル時に決定されます。

静的型付け言語で動的型付けを使用することは可能ですが、広く使用することはお勧めしません。そうすることで、言語によって提供されるほとんどすべてのポリモーフィズム機能を放棄しているからです。型を手動でチェックするか、独自の動的型ベースのポリモーフィズムを実装する必要があります。

返されるデータがそれほど複雑でない場合は、通常、タグ付きの構造を使用することをお勧めします。

struct Value
{
    enum {INT, FLOAT, PTR} type;
    union
    {
        int   int_data;
        float float_data;
        void *ptr_data;
    };
};

サポートに必要な多くの操作を伴うより複雑なデータ型の場合は、抽象インターフェースと継承の使用を検討する必要があります。

問題を真剣に検討し、上記の方法のいずれも問題に当てはまらず、動的型付けが最善の方法であると確信している場合は、次のオプションがあります。

  • boost::any-すべてのタイプの一意のコンテナ。タイプをテストし、使用する前に手動で変換する必要があります。

  • boost::variant--を介して単項多項演算をサポートするユニオンのようなコンテナboost::static_visitor

  • 一部のプログラミングフレームワークは、動的型付けを独自にサポートしています。一例はQVariantQtにあります。このようなフレームワークを使用している場合は、通常、別のライブラリの他のものの代わりにそれらを使用することをお勧めします。

于 2012-10-07T04:57:30.087 に答える