2012-05-08 2 views
5

В C++ 11 можно определить, может ли переменная типа A быть неявно преобразована в тип B на using std::is_convertible<A, B>.std :: is_convertible для type_info

Это хорошо работает, если вы действительно знаете типы A и B, но все, что у меня есть, это type_infos. Так что я ищу это функция, как это:

bool myIsConvertible(const type_info& from, const type_info& to); 

Можно ли реализовать что-то подобное в C++? Если да, то как?

+5

Я не думаю, что это возможно. Но реальный вопрос: что бы вы сделали с такой функцией? – Nawaz

+0

Кроме того, почему у вас есть только 'type_info'? – mfontanini

+0

«Это хорошо работает, если вы действительно знаете типы A и B».Хорошо, но почему вы не знаете типы? – jrok

ответ

1

Я думаю, это можно сделать, если вы знаете тип вашей переменной, о которой вы всегда можете узнать, используя оператор typeid в C++.

Derived* pd = new Derived; 
    Base* pb = pd; 
    cout << typeid(pb).name() << endl; //prints "class Base *" 
    cout << typeid(*pb).name() << endl; //prints "class Derived" 
    cout << typeid(pd).name() << endl; //prints "class Derived *" 

Тогда вы должны создать multimap или с ключом как typeid (который вы хотите знать, если конвертируется в) и значение, как convertible type ids (ConverTable типа) Где, как если. Здесь в этом случае вы можете получить доступ к карте для поиска, если key в вашем случае const type_info& from имеет value, сопоставленный с const type_info& to. Если да, то вы можете вернуть bool как true или false. Но в этом случае вам нужно убедиться, что вы видите все классы и наследование в коде правильно. И на основе решает, будет ли это законное преобразование и добавить на карте на этой основе. Но это был бы утомительный процесс, и я не вижу его использования.

Genrally C++ позволяет узнать через dynamic cast, если тип может быть отлит другим типом или не соответствующим образом. В то время как static_cast даже несовместимы друг с другом, и неправильное использование которых приведет к ошибке во время выполнения.

4

В портативном C++ невозможно выполнить то, что вы хотите.

Это может можно добиться частичного ответа если вы ограничиваете себя на данной платформе. Например, те платформы, которые прилипают к Itanium ABI будут иметь реализацию этой функции:

extern "C" 
void* __dynamic_cast(const void *sub, 
        const abi::__class_type_info *src, 
        const abi::__class_type_info *dst, 
        std::ptrdiff_t src2dst_offset); 

В этом ABI, abi::__class_type_info представляет собой тип, полученный из std::type_info и всехstd::type_info ы в программе вывел динамический типа от std::type_info (abi::__class_type_info - всего лишь один пример).

С помощью этого ABI можно построить инструмент, который будет перемещаться по иерархии наследования любого типа (во время выполнения), учитывая его std::type_info. И при этом вы можете определить, представляют ли два std::type_info s два типа, которые могут быть dynamic_cast или даже static_cast друг другу.

Обратите внимание, что такое решение не будет учитывать преобразование между типами с использованием конструктора преобразования или оператора преобразования. И даже если это ограничение приемлемо, я не рекомендую этот маршрут. Это не простой проект, и он будет очень подвержен ошибкам. Но это, вероятно, то, как ваша реализация на C++ реализует dynamic_cast, так что это явно не невозможно.

Смежные вопросы