3

さまざまなパラメーターと定義を使用して、C++ で関数をオーバーロードするプロセスを認識しています。ただし、パラメーターを除いて同一の2つの関数がある場合、この定義を1回だけ持つ方法があります。

私が使用した機能は、正しい入力 (つまり、文字ではなく数字が入力された) をチェックすることです。1 つは int 用で、もう 1 つは float 用です。これと、参照によって変数を渡すという事実のために、定義はまったく同じです。

2 つの関数宣言は次のとおりです。

void        Input       (float &Ref);
void        Input       (int &Ref);

そして、次の共通の定義を共有します。

Function_Header
{
    static int FirstRun = 0;            // declare first run as 0 (false)

    if (FirstRun++)                     // increment first run after checking for true, this causes this to be missed on first run only.
    {                                       //After first run it is required to clear any previous inputs leftover (i.e. if user entered "10V" 
                                            // previously then the "V" would need to be cleared.
        std::cin.clear();               // clear the error flags
        std::cin.ignore(INT_MAX, '\n'); // discard the row
    }

    while (!(std::cin >> Ref))          // collect input and check it is a valid input (i.e. a number)
    {                                   // if incorrect entry clear the input and request re-entry, loop untill correct user entry.
        std::cin.clear();               // clear the error flags
        std::cin.ignore(INT_MAX, '\n'); // discard the row
        std::cout << "Invalid input! Try again:\t\t\t\t\t"; 
    }
}

同じコードの 2 つの同一のコピーを両方のパラメーター タイプに使用しながら、同じコードを 2 つ持つ必要があることを回避する方法があれば、プログラムのコードを大幅に短縮できます。この問題を抱えているのは私だけではないと確信していますが、検索結果はすべて、複数の定義を使用して関数をオーバーロードする方法の説明です。

ヘルプやアドバイスをいただければ幸いです。

4

3 に答える 3

3

最善の (そして唯一の?) 解決策は、テンプレートを使用することです

于 2013-10-10T14:28:15.200 に答える
2

テンプレートは便利です:

template <typename T>
void Input (T &Ref)
{
   ...
}


std::string s;
int i;
float f;

Input(s);
Input(i);
Input(f);
于 2013-10-10T14:37:21.180 に答える