0

次のようなシグネチャを持つ関数を持つboost、pocoなどのライブラリを知っていますか?

template <typename T> auto vectorize(const std::vector<std::string> & mask, T & t) -> T::iterator

次のように使用できます:

struct A {double x; double y; double z;};
auto a = A();
auto it = vectorize({"x","z"}, a);
//and here doing perturbations and increments on a; ideally it is for passing it to another function

私はそのようなことを行う既存のコードを再設計しています (構造体内でシリアル化する方法を使用) が、私たちのバージョンが非常に面倒であることを認めなければなりません :/

そのための抽象化とタプルの操作のアイデアはありますか? 現在、タプルのフィールドをマッピングするために列挙型を使用しようとしています。

この種の再帰的なコンテナの反復の問題に対して、誰かが何かインテリジェントなものを書いたことは間違いありません。(私はboost::fusionを見てきましたが、タイプのみでフィルタリングするか、ページを見逃しました)

4

1 に答える 1

0

C ++には、多くのVM言語のようにこれをうまく行うための魔法の方法はありません。

通常、ブーストシリアル化のようなものを使用します。目標は、単純なマッピング関数を作成することであり、残りはポリシーを構成することです。

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

class gps_position
{
public:
    int degrees;
    int minutes;
    float seconds;
    gps_position(){};
    gps_position(int d, int m, float s) :
        degrees(d), minutes(m), seconds(s)
    {}
};

namespace boost {
namespace serialization {

template<class Archive>
void serialize(Archive & ar, gps_position & g, const unsigned int version)
{
    ar & g.degrees;
    ar & g.minutes;
    ar & g.seconds;
}

} // namespace serialization
} // namespace boost

std::tupleあるいは、常にdoubleをシリアル化している、またはboost::tuplec ++ 11を使用していない場合に静的ビジターを書き込むことを前提とした、単純なものである程度の牽引力を得ることができる場合があります。

于 2013-01-31T19:01:18.423 に答える