0

クラス変数に値を割り当てることができるように、文字列を評価する必要があります。

クラス :

class DATACLASS {
public:
    double variable1, variable2, variable3;
};

void init() :

void init() 
{
    DATACLASS *d = new DATACLASS;
    std::string ssList[3] = {"variable1", 
                             "variable2", 
                             "variable3"};                        
    for(unsigned i = 0; i < 3; ++i)
    {
      std::stringstream ss;
      ss << ssList[i];
      //ss.str().c_str() correspond to "variable1", "variable2", "variable3"
      mxArray *array_ptr = mexGetVariable("base", ss.str().c_str());
      double pr = (double)mxGetPr(array_ptr)[0];
      // How to make the same thing here?
      // I would like to have something that would evaluate
      // data->ssList[i] = pr;
      // or more precisely      
      // data->variable1 = pr;
      // but from the ss string like below (but this doesn't work)
      data->ss.str().c_str() = pr;
    }

このようにしようとすると、この種のエラーが発生します。

error C2039: 'ss' : is not a member of 'DATACLASS'
4

3 に答える 3

0

ダブルスだけ読んでいますか?これには、データ メンバーへのポインターを使用できます。

    std::map<std::string, double DATACLASS::*> aMembers;
    aMembers["variable1"] = &DATACLASS::variable1;
    aMembers["variable2"] = &DATACLASS::variable2;
    aMembers["variable3"] = &DATACLASS::variable3;

    DATACLASS dc;
    std::string sData = "variable1";
    dc.*aMembers[sData] = 10;

完全なソリューションでは、もちろん aMembers[sData] が最初に存在することを確認する必要があります。複数のデータ型をサポートする必要がある場合は、テンプレートを使用していくつかのサポート クラスを作成する必要があります。しかし、それは実行可能なはずです。

于 2013-05-31T19:00:20.510 に答える
0

多大な労力を費やすことなく合理的に到達できる最も近いものは、次のようなものです。マクロ、関数、コンテナー、テンプレート、ポインター/参照などを使用していくつかのものを抽象化できますが、これが基本的な要点です。やむを得ない理由がない限り、これを実行して時間を割くことはお勧めしません。あなたの最終目標は何ですか?

class DATACLASS {
public:
    double variable1, variable2, variable3;
};

void init() 
{
    DATACLASS *d = new DATACLASS;
    std::string ssList[3] = {"variable1", 
                             "variable2", 
                             "variable3"};                        
    for(unsigned i = 0; i < 3; ++i)
    {
      std::stringstream ss;
      ss << ssList[i];
      //ss.str().c_str() correspond to "variable1", "variable2", "variable3"
      mxArray *array_ptr = mexGetVariable("base", ss.str().c_str());
      double pr = (double)mxGetPr(array_ptr)[0];
      if(ss.str() == "variable1")
        data->variable1 = pr;
      else if(ss.str() == "variable2")
        data->variable2 = pr;
      else if(ss.str() == "variable3")
        data->variable3 = pr;
    }
}
于 2013-05-31T18:59:12.703 に答える
0

これは有効な C++ ではありません。あなたがやろうとしているとコンパイラが考えるのは、DATACLASS呼び出されたインスタンスのメンバーにアクセスし、ssその上でいくつかのメソッドを呼び出すことです。

あなたがしようとしていることは、C++ ではサポートされていないリフレクションで実行できます。テンプレートを使用して何らかの形式の疑似反射モデルを使用することで、中途半端にすることができます。

于 2013-05-31T18:40:12.200 に答える