我也有幾類與查訪功能,像這樣:模板和樣式位訪客
struct Person {
std::string name;
unsigned age;
template<class Visitor>
void visit(Visitor& c)
{
c("name", name);
c("age", age);
}
template<class Visitor>
void visit(Visitor& c) const
{
c("name", name);
c("age", age);
}
};
我有這樣一個訪問者:
struct PrintVisitor
{
PrintVisitor(std::ostream& stream)
: m_stream(stream)
{}
template<class T>
void operator()(const std::string& name, const T& v)
{
m_stream << name << ": " << v << std::endl;
}
private:
std::ostream& m_stream;
};
對每一個參觀者我想定義流操作:
std::ostream& operator<<(std::ostream& stream, const Person& p)
{
PrintVisitor printer(stream);
p.visit(printer);
return stream;
}
是否有可能提供一個單一的運營商< <一個接受可以上課嗎?
(現在,我只是嘗試印刷,但其實我是想實現 JSON序列化,反序列化,也許平等,低於運營商。
UPDATE
我用戴維斯溶液:
基類CRTP:
template <class T>
struct Visitable {};
所有的Visitable類從那裏繼承:
struct Person : Visitable<Person> { ... }
運算符和函數模板的左右,而使用靜態澆鑄訪問類:
template<class T>
std::ostream& operator<<(std::ostream& stream, const Visitable<T>& p)
{
PrintVisitor printer(stream);
static_cast<const T&>(p).visit(printer);
return stream;
}
我有解析困難「是否有可能不需要在模板函數中實現一次運算符」 – PlasmaHH 2012-08-14 13:18:14
謝謝,更正。 – nishantjr 2012-08-14 13:21:29