我有一个持久性类,例如:
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 上的所有其他帖子。