0

我有一个持久性类,例如:

class Writer: private boost::noncopyable {
    template<typename T>
    struct Record {
        std::vector<T> _queued; // waiting to be persisted
        hsize_t _fileRows; // on disk
        DataSet _ds;
        ...
    };

    template<typename T>
    void write(Writer::Record<T>& rcrd) { ... }
    ...

这用于持久化类型,例如:

struct A {
    sockaddr_in udpAddr;
    ...
}

struct B {
    uint8_t id;
    ...
}

struct C { ... }
...

我无法更改上面的 API,我想对这些异构类型执行批量操作。我按照他们自己的教程使用boost::variant并取得了部分成功:

typedef boost::variant< Record<A>, Record<B>, Record<C>, ...> _types;
std::vector<_types> _records;

struct CloseRecordVisitor : public boost::static_visitor<> {
    template <typename T>
    void operator()(T& operand) const {
        assert(operand._queued.empty());
        operand._ds.close();
    }
}; // This seems to work -template argument is substituted with Record<A>, Record<B>,...

struct WriteRecordVisitor : public boost::static_visitor<> {
    template <typename T>
    void operator()(T& operand) const {
        Writer::write(operand);
    }
}; // This never compiles

然后,所有(许多)异构类型的批量操作旨在简单地完成:

CloseRecordVisitor _closeRecordVisitor;
std::for_each(_records.begin(), _records.end(), boost::apply_visitor(_closeRecordVisitor));

WriteRecordVisitor _writeRecordVisitor;
std::for_each(_records.begin(), _records.end(), boost::apply_visitor(_writeRecordVisitor));

WriteRecordVisitor 无法编译。错误是

No matching function to call ...template substitution failed. Cannot convert 'operand' (type Writer::Record<A>) to type 'Writer::Record<Record<A>>&'

这显然看起来不对,但我不知道是什么原因造成的。

我想要么让 WriteRecordVisitor 方法工作,要么能够遍历向量(获得 boost::variant<...>)并以某种方式(再次模板,可能)使用 boost::get 传递每个适当的元素( Record<A>, Record<B>, ...) 到 Writer::write(Record<T>)。

我还想避免为每种可能的异构类型定义访问者运算符,因为这会破坏最初使用异构容器进行简化的最初目标。

我在 Linux 3.5.4 Fedora 17 上使用 gcc 4.7.2。感谢任何帮助 - 我在发布之前确实阅读了 boost::variant 上的所有其他帖子。

4

0 回答 0