4

Parameter クラスがあり、bool または double を受け入れるようにコンストラクターをオーバーロードしました。int を指定すると、ビルドに失敗します。

エラー C2668: 'Parameter::Parameter': オーバーロードされた関数へのあいまいな呼び出しは、'Parameter::Parameter(std::string,std::string,double)' または
'Parameter::Parameter(std::string,std: :string,bool)'

次の 2 つのオプションがあると思います。

  1. int デフォルトでオーバーロードする
  2. 変数を double に明示的に変換する

私は大量のパラメーターを持っていますが、そのうちのいくつかは unsigned long や float など (プロジェクトでは複数の人がサポートしています) であるため、どちらも完璧なソリューションではありません。int から double への暗黙的な変換を強制する方法はありますか? ありがとう。

コード:

#include <string>
#include <unordered_map>
using namespace std;

class Parameter
{
public:
    enum eVarType { BOOL, NUMBER};

    Parameter() {};
    Parameter( string param_name, string param_description, bool dft ) { type_ = BOOL;};
    Parameter( string param_name, string param_description, double dft ) { type_ = NUMBER;};
private:
    eVarType type_;
};

class ParameterManager
{
public:
    template<typename T> void add( string option_name, string description, T value );
private:
    std::unordered_map< string, Parameter > parameters;
};

template<typename T> void ParameterManager::add( string param, string description, T value )
{
    parameters[param] = Parameter( param, description, value );
};

int main()
{
    ParameterManager mgr;
    int var = 1;
    mgr.add("number","This is an int",var); //Could be double or bool: I want it to be a double
}
4

3 に答える 3

-1

非常に単純なバージョンは、テンプレート パラメーターをコンストラクターに使用し、非テンプレート オーバーロードbool(および double に変換したくない他の型) を使用することです。

Parameter( string param_name, string param_description, bool dft ) { type_ = BOOL;}
// note, no trailing semicolon required for inline method definitions

template<typename T>
Parameter( string param_name, string param_description, T dft )
{ 
    type_ = NUMBER;
    value = static_cast<double>(dft);
}

(おそらく、「実際のコード」は実際に で何かを行いdftます)。

型が double にキャストできない場合、コンパイラ エラーが発生します。

他の回答では、この手法のより高度なバージョンを使用して、T特定のタイプのみに一致させることができます (すべてのタイプに一致する私のバージョンとは対照的に、無効なタイプが使用されている場合はエラーが発生します)。

于 2014-08-13T21:57:00.500 に答える