В C++ неявно выполняются преобразования типов. Например, объекту типа int
можно назначить const int
(как это сделано в первых строках основной функции в приведенном ниже коде).Проверка конвертируемости во время выполнения в C++
Теперь я хотел бы проверить конвертируемость во время выполнения в том, что у меня есть структура, в которой я могу добавлять типы, и позже я хочу проверить для данного типа, если один из типов, хранящихся в структуре, будет конвертирован в данный тип.
Вот что я придумал до сих пор:
#include <iostream>
#include <vector>
struct bar { virtual void dummy() {} };
template<typename T> struct foo : public bar { virtual void dummy() {} };
int main() {
int i1 = 1;
const int i2 = i1;
std::vector<bar*> bars;
bar* t1 = new foo<int>; bars.push_back(t1);
bar* t2 = new foo<int const>; bars.push_back(t2);
foo<int const>* t3 = dynamic_cast<foo<int const>*>(bars[0]);
std::cout << t3 << std::endl;
foo<int const>* t4 = dynamic_cast<foo<int const>*>(bars[1]);
std::cout << t4 << std::endl;
delete t1;
delete t2;
return 0;
}
Для хранения типов в структуре Я создал шаблонный структуру foo
, который является производным от bar
. Тогда я могу хранить разные типы int
и int const
(точнее, указатели на объекты типа foo<int>
и foo<int const>
) в векторе bar*
s. Тогда для данного типа (здесь int const
) я проверяю каждый элемент в этом векторе, если он может быть динамически добавлен к foo
с этим типом.
При запуске этого кода t3
становится nullptr
и t4
указателем, не содержащим нуль. Но я хотел иметь для t3
также ненулевой указатель.
Надеюсь, стало ясно, что я хочу.
Есть ли у вас какие-либо идеи о том, как достичь такой проверки на возможность конвертирования во время выполнения (решение с использованием 11-функций C++ было бы полностью прекрасным)?
Ах, двойную диспетчеризацию. Мы снова встречаемся. –
Если вы знаете и согласны с перечислением всех возможных преобразований во время компиляции, это возможно. В противном случае это невозможно. –
Моя первая реакция была: Использовать 'std :: is_convertible :: value', но по какой-то причине я получаю, что' std :: is_convertible :: value' is true (почему?). –
alfC