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

明白なことを述べると、特定のタイプをユーザーに返したくない場合は、テンプレート化する必要があります。それについてあなたができることは何もありません。

于 2012-05-03T15:42:49.353 に答える