0

我正在尝试实现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");
}
};

我使用持有者类(由 继承holderBase)来存储数据。如何修改any::get()函数(甚至修改整个代码)使其不需要模板参数(get()函数)?

4

2 回答 2

1

你可以这样做:

template<typename T>
T get(T *ptr);

与 Ctime函数类似,您将返回结果并将其存储在ptr.

编辑:您还可以覆盖铸造运算符:

template<typename T>
operator T()
{
   return get<T>();
}

这将隐含地做你想要的。

于 2012-05-03T15:33:47.527 回答
0

显而易见:如果您不想将 1 个特定类型返回给用户,则需要对其进行模板化。你对此无能为力。

于 2012-05-03T15:42:49.353 回答