gpt4 book ai didi

c++ boost::any 来定义我自己的 print ,

转载 作者:太空狗 更新时间:2023-10-29 20:47:41 25 4
gpt4 key购买 nike

我很难找到如何使用 boost::any首先使用模板创建一个可以打印任何类型的打印函数。

template <typename T>
struct printer {
void print(ostream& os, const boost::any& a);
};

我需要先定义 print() .我希望拥有真正的operator <<对于 any,想法很简单:将类的实例附加到每个 any 对象 printer<T>使用合适的 T 并在 any 的值类型时更改此对象变化。第一个技术问题是打印机对象依赖于 T 而 any 不是(也不应该是)类模板。

今晚或明天我真的需要帮助我有明天的最后期限,但我希望今晚能完成。

最佳答案

Beyond the C++ Standard Library: An Introduction to Boost”中描述了一种非常简单的方法:

struct streamer {
virtual void print(ostream &o, const boost::any &a) const =0;
virtual streamer * clone() const = 0;
virtual ~streamer() {}
};

template <class T>
struct streamer_impl: streamer{
void print(ostream &o, const boost::any &a) const { o << *boost::any_cast<T>(a); }
streamer *clone() const { return new streamer_impl<T>(); }
};

class any_out {
streamer *streamer_;
boost::any o_;
void swap(any_out & r){
std::swap(streamer_, r.streamer_);
std::swap(o_, r.o_);
}
public:
any_out(): streamer_(0) {}
template<class T> any_out(const T& value)
: streamer_(new streamer_impl<T>()), o_(value) {}
any_out(const any_out& a)
: streamer_(a.streamer_ ? a.streamer_->clone() : 0), o_(a.o_) {}

template <class T>
any_out & operator=(const T& r) {
any_out(r).swap(*this);
return *this;
}
~any_out() { delete streamer_; }

friend std::ostream &operator<<(std::ostream& o, const any_out & a) {
if(a.streamer_)
a.streamer_->print(o, a);
return o;
}
};

然后你使用 any_out 而不是 boost::any

关于c++ boost::any 来定义我自己的 print ,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4985351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com