Использование std :: is_convertible с std :: type_index - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть вектор std::type_index, который указывает типы признаков, которые есть у конкретного узла. Я реализую функцию, которая проверяет, поддерживает ли узел определенный тип. Это выглядит так:

std::vector<std::type_index> traits;

...

template <typename T>
bool hasTrait() {
    return std::find(traits.begin(), traits.end(), typeid(T)) != traits.end();
}

Однако это не будет работать, если тип T является производным типом некоторого базового типа в чертах. Чтобы решить эту проблему, я хотел использовать std::is_convertible.

Однако у меня есть доступ только к std::type_index типа, поэтому я не могу этого сделать. Требуется что-то подобное: std::is_convertible<traitTypeIndex::type, T>

1 Ответ

1 голос
/ 17 апреля 2019

Сначала я бы упомянул, что это невозможно с std::is_convertible. Как и все остальные вещи из type_traits, std::is_convertible - это чисто компиляция. Но вы хотите, чтобы он давал вам ответ во время выполнения для некоторого аргумента времени выполнения (который является type_index).

Второй вопрос: может ли эта проверка вообще быть реализована для произвольных полиморфных типов (под «произвольным» я подразумеваю, что у вас нет какой-либо конкретной информации времени разработки или выполнения). Я думаю, что это не невозможно, потому что все отражение времени выполнения, которое мы имеем в C ++, составляет dynamic_cast (когда RTTI включен). Однако даже в dynamic_cast у нас есть один полудинамический аргумент (указатель или ссылка) и один статический (тип, в который мы не хотим преобразовывать). Я пишу semi-dynamic, потому что это должен быть указатель или ссылка на какой-то определенный тип, он не может абсолютно стереть тип аргумента (например, void*). Я считаю, что для динамической проверки, является ли один из двух типов наследником другого, нам нужна дополнительная поддержка во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...