2013-01-05 15 views
8

ここでは、次のように説明します。2つのよく知られた型の値を受け取るvoid関数を作成したいことがあります。私はちょうどこのでしたので、私は値の型const void*を作るためにtryiedC++は任意の型の引数を関数に送ります。

void change_settings(string element, short setting, ??? value) { 
    switch (setting) { 
     case ST_NAME: 
      // Cast value to string or char* and change element.name 
     break; 
     case ST_AMOUNT: 
      // Cast value to integer and change element.amount 
     break; 
     case ST_ENABLED: 
      // Cast value to boolean and change element.enabled 
     break; 
    } 
} 

が、私はエラー(cast from ‘const void*’ to ‘short int’ loses precision)を取得:いくつかのクレイジーな絶望的な裁判でなければならないshort name = (short)valueを、幸運を期待して、コードは次のようになります。さて、私はこれを行う方法があるかどうかわからない、何らかの変数のポインタを渡して、それを何に変換するか(それぞれの場合に応じて期待する変数の型を知っている) どうすればよいだろう?ありがとう

答えて

7

事前にvalueのすべての潜在的なタイプを知っているように見える、とあなたはタイプによって異なる振る舞いをしたいので、あなただけの関数オーバーロードのシリーズを書くことができます!

void change_settings(const std::string& element, short setting, const std::string& value); 

void change_settings(const std::string& element, short setting, int value); 

void change_settings(const std::string& element, short setting, bool value); 

この排除ランタイムスイッチの必要性。

+0

を使用する必要があります。 – Caesar

+0

ええ、それは 'setting'変数を不要にします。 –

+1

これを試してみましょう。もちろん、私はint値を必要とするケースが異なる場合でもswitchとsettingを使うことができます。たとえば、 – ali

5

ランタイムスイッチヒンジ(コンパイル時とは対照的に、テンプレートがおそらく答えです):

)、多分多型を使用する(すなわち、継承階層を定義し、特定の振る舞いを実装するための仮想関数を使用する)。

+0

これはプロの方法だと思いますが、私は真剣なアプリケーションを作成するときにそれを覚えています。ありがとう – ali

+0

2番目のオプションとして 'boost :: any'を意味しますか?> – Puppy

12

あなたは本当ですが、各設定ごとに異なる関数を作成し、スイッチケースを回避していない理由を、その時点でtemplates

template <typename T> 
void change_settings(string element, short setting, T value); 
+0

素晴らしい!ありがとう!それはそれを行うでしょう – ali

+2

問題は、 'T'が間違った型であるときに実行時のスイッチコードのキャストがコンパイルされないことです。私はちょうど一連の関数オーバーロードを書くだろう –

+0

確かに、それは起こることです。 – ali

関連する問題