using ToFieldType = typename ToDataType::FieldType;
    using ColumnType = typename ToDataType::ColumnType;
    String getName() const override { return name; }
    size_t getNumberOfArguments() const override { return 1; }
    DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
    {
        const IDataType & type = *arguments[0];
        if constexpr (support_between_float_integer)
        {
            if (!isStringOrFixedString(type) && !isNumber(type))
                throw Exception(
                    "Cannot reinterpret " + type.getName() + " as " + ToDataType().getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
            if (isNumber(type))
            {
                if (type.getSizeOfValueInMemory() != ToDataType{}.getSizeOfValueInMemory())
                    throw Exception(
                        "Cannot reinterpret " + type.getName() + " as " + ToDataType().getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
            }
        }
        else
        {
            if (!isStringOrFixedString(type))
                throw Exception(
                    "Cannot reinterpret " + type.getName() + " as " + ToDataType().getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
        }
        return std::make_shared<ToDataType>();
    }
    bool useDefaultImplementationForConstants() const override { return true; }