0
class myFun(Employee obj, String attribute)
{
   //return proper attribute value without using conditions like If-Else, ternary or     
   // conditional operators like && etc.
}

今私が呼び出す場合:

myFun(obj, “name”); 

次に、この関数は、パラメータとして渡されたオブジェクト「obj」からEmployeeの名前を返す必要があります。したがって、属性値の名前に基づいて、そのオブジェクトの属性値を返す必要があります。

if条件やswitchステートメントを使用せずにC++でそれを行う方法はありますか?私はPythonでgetattrを使用できることを知っています。

4

4 に答える 4

3

独自のリフレクションのような動作を実装する必要があります。たとえば、各属性の名前を登録するオブジェクト内にマップを作成し、おそらく値 (または何か) を取得するためのファンクタを作成できます。

言い換えれば、それは実行可能ですが、言語でサポートされていないため、コードの他の読者にとって短く、単純で、自動でなく、必ずしも非常に直感的ではありません.

于 2013-02-28T11:11:14.280 に答える
1

いいえ、C ++にはリフレクションがないため、条件なしでは実行できません。

于 2013-02-28T11:09:36.063 に答える
0

クラスの構造を変更しないと不可能です。パフォーマンスが重要でない場合は、次の回避策があります。

class Employee{
    std::map<std::string, std::string> attributes;
    /*SNIP*/
    public:
    void addAttr(std::string attr, std::string value){ attributes[attr] = value; }
    std::string getValue(std::string attr){ return attributes[attr]; }
    //Use this function if you are using c++11 compiler: std::string getValue(std::string attr){ return attributes.at(attr); }
}
于 2013-02-28T11:16:24.543 に答える
0

間接的ではありますが、リフレクションは C++ で可能です ;)

これに関連する記事の一部...

http://lcgapp.cern.ch/project/architecture/ReflectionPaper.pdf http://replicaisland.blogspot.co.il/2010/11/building-reflective-object-system-in-c.html http:// www.vollmann.com/pubs/meta/meta/meta.html

したがって、リフレクションを使用してその動作を実現できます。もちろん、これらの記事には、最初に使用できる例が含まれています。質問があれば遠慮なく共有してください。

BOOST_FUSION_ADAPT_STRUCT http://boost-spirit.com/dl_more/fusion_v2/libs/fusion/doc/html/fusion/extension/macros/adapt_struct.htmlを試すこともできます。

于 2013-02-28T11:22:21.133 に答える