2012-05-03 4 views
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によって継承されます)ホルダークラスを使用します。 テンプレートパラメータ(get()関数)を必要としないように、any::get()関数を変更する(またはコード全体を変更する)方法を教えてください。

+0

@LucDanton:はい。私の悪い! – dirkgently

答えて

0

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

1

あなたはこのようにそれを行うことができます:

はC time機能と同様に
template<typename T> 
T get(T *ptr); 

、あなたはそれptrに店舗だけでなく、結果を返します。

編集:暗黙的にあなたがやりたいだろう

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

:あなたはまた、キャスト演算子をオーバーライドすることができます。

+1

+1は最初のオプションは、私はすべてのコストで2番目を避けるだろう。暗黙的な変換は一般的には悪い考えであり、* any *型への暗黙の変換は最悪の変換です。 –

関連する問題