Follow
======

#### 函数功能

用于指定当前输入/输出的datatype/format/shape信息与之前定义过的某个输入一致。

#### 函数原型

OpParamDef &Follow(const char \*paramName);
OpParamDef &Follow(const char \*paramName, FollowType ftype);

#### 参数说明

| 参数 | 输入/输出 | 说明 |
| :-- | :-- | :-- |
| paramName | 输入 | 之前定义过的输入名。 |
| ftype | 输入 | 
ftype类型为枚举类FollowType，表示Follow的模式，取值如下。

\- ALL，datatype/format/shape与paramName均保持一致。

\- DTYPE，datatype与paramName保持一致。

\- FORMAT，format与paramName保持一致。

\- SHAPE，shape与paramName保持一致。

 |

#### 返回值

[OpParamDef](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-paramtype)算子定义。

#### 约束说明

*   所有Follow的数据源头仅支持为Input。
    
*   针对shape推导，仅支持输出参数Follow输入参数，不支持输入参数Follow另一个输入参数。
    
*   可以支持链式Follow，例如C Follow B，B Follow A，但此时Follow的模式不可中途变更（ftype需要保持一致）。
    
*   使用Follow接口通常比InferShape函数逻辑更加简单，能用Follow表达的逻辑，建议使用Follow接口，则无需再编写注册InferShape函数。
    
*   InferShape推导函数和使用Follow接口去Follow shape不能混用，即不支持部分输出采用Infershape推导、部分输出采用Follow推导的情况。若开发者同时使用了InferShape函数和Follow接口，以开发者的InferShape函数为准，需要保证在InferShape函数中能够推导出所有的输出shape。
    

#### 调用示例

输出“y1”Follow输入“x1”场景，此时“y1”的datatype、format以及shape都将会和“x1”保持一致。

this->Input("x1")
    .ParamType(REQUIRED)
    .DataType({ge::DT\_FLOAT, ge::DT\_FLOAT})
    .Format({ge::FORMAT\_ND, ge::FORMAT\_ND});
this->Input("x2")
    .ParamType(REQUIRED)
    .DataType({ge::DT\_FLOAT, ge::DT\_FLOAT})
    .Format({ge::FORMAT\_ND, ge::FORMAT\_ND});
this->Output("y1")
    .ParamType(REQUIRED)
    .Follow("x1")
    .OutputShapeDependOnCompute();