Type Erasure を使用して、任意の型をカプセル化するオブジェクトを作成し (それを と呼びましょうErasedType
)、実行時にクエリを実行して、別の任意の型T
が に変換可能かどうかを確認できますErasedType
か?
考えてみると、理論上は可能かもしれませんが、可能ではないと思います。コンパイラはT
、比較しようとしている型を認識しているErasedType
ため、実行前に必要なコードを生成できます。問題は、実際には、基本クラスのインスタンスからサブクラスのインスタンスにテンプレート パラメーターの型を渡す方法がないように見えることです。
例えば:
struct FooBase
{
template <class TestType>
bool is_convertible()
{
return call_derived();
}
protected:
virtual bool call_derived() = 0;
template <class ErasedType>
void base_class_function() { }
};
template <class ErasedType>
struct Foo : public FooBase
{
bool call_derived()
{
// Here we have access to the ErasedType but no access to TestType.
//
// We could pass ErasedType to a base class function by saying:
//
// this->base_class_function<ErasedType>();
//
// ...but that doesn't seem to help since we still don't have access to
// TestType
}
};
したがって、目標は次のようなことを言えるようになることです。
FooBase* f = new Foo<int>();
bool res1 = f->is_convertible<double>(); // returns true
bool res2 = f->is_convertible<long>(); // returns true
bool res3 = f->is_convertible<std::string>(); // returns false
しかし、同じ関数内で makeとaccess を一緒に行う方法がないため、FooBase::is_convertible
メソッドを実装する方法がわかりません。したがって、コンパイラは次の結果を計算できます。TestType
ErasedType
std::is_convertible<TestType, ErasedType>::value
それで、これはまったく可能ですか?