2017-02-16 1 views
1

関数の入力にパラメータを指定すると、その特定の名前の変数を返すことは可能ですか?例えばC++の変数名に基づいて特定の変数を返しますか?

次のコードがあった場合、:

string returnsParameter(string parameter) 
{ 
    string a = "test"; 
    string b = "test 2"; 
    string c = "test 3"; 

    return parameter; 
} 

をそして、あなたはreturnsParameter("a")を実行し、「テスト」を返す方法のいくつかの並べ替えはありますか?私はポインタと参照変数を使ってみましたが、非定数参照を作ることはできません。

マップを使用せずにこれを行う方法はありますか?

+0

'if(parameter ==" a ")return a;'繰り返し3回? C++コンパイラは通常、実行時に変数名に関する情報を格納しないので、 'if'sを自分で入力しないようにするには、いくつかのメタプログラミング(おそらくマクロを使用)に頼らざるを得ません。 – yeputons

+0

いいえ、変数名はコンパイル時に「消えます」。あなたはマップと同様の何かをすることができます。 – Biffen

+0

私はif文を使うことができましたが、実際には19個の変数が含まれています。そうする簡単な方法があるのだろうか? 私はマップを使いたかったのですが、このエクササイズの目的では(これはイントロレベルのC++クラスです)、配列、ベクトル、または特殊オブジェクトにデータを格納することはできません。 – ohitsanazn

答えて

5

この目的でstd::mapを使用できます。 map<string, string> strings を作成し、("a", "test")のペアを追加してstrings[parameter]を返します。 私が知る限り、変数名にアクセスすることは不可能です。 (これは私の信念である、私は完全にわからない)

1

あなたがstd::mapを使用することを許可されていない場合、私は、あなたが条件の設定を使用する必要が怖いあなたはすべての変数を作成する必要はありません注意してください。

string returnsParameter(string parameter) 
{ 
    if(parameter == "a") return "test"; 
    if(parameter == "b") return "test 2"; 
    if(parameter == "c") return "test 3"; 

    return "???"; 
} 
1

アルファベットa〜zにのみキードメインが存在し、データがコードで固定されている場合は、 charでインデックスするための静的配列を作成することができます。

const std::string& lookup(char key) 
{ 
    static const std::string bank[] = { 
     "Apple", 
     "Banana", 
     "Cranberry",   
    }; 
    static const size_t n = sizeof bank/sizeof bank[0]; 

    int i = key - 'a'; 
    return i >= 0 && i < n ? bank[i]: "N/A";  
} 

lookup('a'); // string("Apple") 
lookup('c'); // string("Cranberry") 
0

システムでも変数名と、返すためにどのキー/値のペアを決定するためにそれを使用しなければならないとして、任意の解決策は、少なくとも内部的に、使用するマップを必要とします。

std :: mapを使用するか、if文で値をハードワイヤリングするか、独自のルックアップテーブルを使用します。ただし、キーが見つからない場合に備えて、デフォルトの戻り値を持つ必要があることに注意してください。

string returnsParameter(string parameter) 
{ 
    vector<string> values = 
    { 
     "a", "test", 
     "b", "test 2", 
     "c", "test 3" 
    } 

    for(int i = 0; i < values.size(); i += 2) 
    {= 
     if(values[i] == parameter) return values[i + 1]; 
    } 

    return "Not Found"; 
} 
関連する問題