Можно ли вообще использовать 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
Но я не понимаю, как можно реализовать метод FooBase::is_convertible
, поскольку я не вижу способа сделать TestType
и ErasedType
доступными вместе в одной функции, чтобы компилятор мог вычислить результат std::is_convertible<TestType, ErasedType>::value
.
Так это вообще возможно?
type_id
конкретного типа... но черты - это конструкция времени компиляции, которая на самом деле не взаимодействует с динамической типизацией. - person Kerrek SB   schedule 10.08.2012TestType
иErasedType
ОБА не скрыты? - person Channel72   schedule 10.08.2012