1
4

2 に答える 2

0

これは、あなたの望むことですか?

struct Base
{
  virtual void* convert(const std::type_info&) = 0;
};

template<typename T>
struct Derived : Base
{
  virtual void* convert(const std::type_info& ti)
  { return typeid(T) == ti ? &t : nullptr; }

  T t;
};

struct Any
{
  Base* b;

  template<typename U>
    operator U()
    {
      if (auto p = b->convert(typeid(U)))
        return *static_cast<U*>(p);
      throw std::exception();
    }
};

他の答えが言うように、あなたが達成しようとしていることを説明しておらず、無効なコードを示しているだけなので、あなたが何を望んでいるのかを正確に知ることは困難です。

編集ああ私は今あなたがそれが完全に一致するだけでなく、どんなコンバーチブルタイプでも機能することを望んでいるのを見ます...そしていいえ、あなたはtype_infoそれが表すタイプに戻すことはできません、それは派生タイプがテストするために必要になるでしょう与えられtype_infoたものは、その格納されたタイプが変換可能なタイプに対応します。正しいタイプを知り、それを明示的または暗黙的に控除によって指定する必要があります。その後、別のタイプに変換する場合は、個別に行うことができます。

Any a{ new Derived<int>() };
try {
  char c = a;  // throws
}
catch (...)
{
}
int i = a;        // OK
char c = (int)a;  // OK
于 2013-01-01T16:20:01.797 に答える
-1


あなたの更新に基づいて、これがあなたがやろうとしていることだと思います。

#include <typeinfo>
#include <exception>
#include <string>

template <typename T>
struct Any{
        T* t;
        Any():t(NULL){}
        Any(const T& _t){
                t=new T(_t);
        }
        template<typename U>
        operator U(){
                if(typeid(T)!=typeid(U) || t==NULL)
                        throw std::exception();
                return *t;
        }
};

int main (){
        Any<std::string> a(std::string("Nothing"));
        std::string b=a;
        return 0;
};

これで解決しない場合は、達成しようとしていることをコードではなくテキストで説明してください。Base と Derived の 2 つの追加クラスを使用する理由も教えていただけると助かります。

于 2012-12-31T10:35:52.813 に答える