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 语言那样很好地做到这一点。

通常你会使用类似boost serialization的东西。目标是您只需编写一个简单的映射函数,其余的只是配置策略。

#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::tupleboost::tuple不使用 c++11 编写静态访问者。

于 2013-01-31T19:01:18.423 回答