9

ここでは、2 つのよく知られた型の値と、その他の型の値を受け取る void 関数を作成したいと考えています。コードは次のようになります。

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;
    }
}

値の型を作成しようとしましたconst void*が、エラー ( cast from ‘const void*’ to ‘short int’ loses precision) が発生しましshort name = (short)valueた。さて、これを行う方法があるかどうかはわかりません。どんな種類の変数のポインタを渡してから、それを変換します(それぞれのケースに応じて期待される変数のタイプを知っています。どうすればいいですか?ありがとう!

4

3 に答える 3

13

テンプレートを使用する必要があります

template <typename T>
void change_settings(string element, short setting, T value);
于 2013-01-05T20:12:15.587 に答える
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);

これにより、ランタイム スイッチが不要になります。

于 2013-01-05T20:11:20.313 に答える
5

実行時の切り替えについて話していると仮定します(コンパイル時とは対照的に、その場合、テンプレートがおそらく答えです):

バリアント クラス (例: boost::variant) を検討するか、ポリモーフィズム (つまり、継承階層を定義し、特定の動作を実装するための仮想関数) を使用することができます。

于 2013-01-05T20:12:06.880 に答える