Код: Выделить всё
castОператор приведения является операцией «проверенного приведения». Он преобразует указатель или ссылку из базового класса в производный класс, что приводит к сбою утверждения, если на самом деле это не экземпляр правильного типа. Это следует использовать в тех случаях, когда у вас есть некоторая информация, которая заставляет вас поверить, что что-то относится к правильному типу. Пример шаблона isa и cast:
Код: Выделить всё
static bool isLoopInvariant(const Value *V, const Loop *L) {
if (isa(V) || isa(V) || isa(V))
return true;
// Otherwise, it must be an instruction...
return !L->contains(cast(V)->getParent());
}
Код: Выделить всё
// op is mlir::tosa::TransposeOp
auto val = op.getOperand(0); // returns mlir::Value
if (val.getType().getShape().size() > 4) // compilation failure
...
Код: Выделить всё
auto val = mlir::cast(op.getOperand(0));
if (val.getType().getShape().size() > 4)
...
Мне трудно понять, как это приведение может работать правильно. Предоставляет ли mlir::Value каким-то волшебным образом необходимую информацию для создания mlir::TypedValue, или я наблюдаю какой-то UB, который случайно дает ожидаемый результат?
Подробнее здесь: https://stackoverflow.com/questions/797 ... ed-classes
Мобильная версия