我正在尝试像{class}这样实现boost::any
:
struct any
{
private:
struct holderBase
{
virtual ~holderBase(){}
};
template<typename T>
struct holder : public holderBase
{
T content;
holder(const T& value) : content(value){}
holder(const holder<T>& other) : content(other.content){}
};
holderBase *hl;
public:
template<typename T>
any(const T& data = T()) { hl = new holder<T>(data); }
any(const any& other) { hl = other.hl; }
template<typename T>
T get()
{
if(holder<T>* p_hl = dynamic_cast<holder<T>*>(hl))
return p_hl->content;
else
throw std::runtime_error("std::runtime_error");
}
};
我使用holder类(由holderBase
继承)来存储数据。
如何修改any::get()
函数(甚至修改整个代码),使其不需要模板参数(get()
函数)?
答案 0 :(得分:1)
你可以这样做:
template<typename T>
T get(T *ptr);
与C time
函数类似,您将返回结果,并将其存储在ptr
中。
编辑:您也可以覆盖投射操作符:
template<typename T>
operator T()
{
return get<T>();
}
这将隐含地做你想要的。
答案 1 :(得分:0)
说明显而易见:如果您不想将1个特定类型返回给用户,则需要模板化。你无能为力。