声明使用相同参数的两个不同方法

Declaring two different methods which use the same parameters

本文关键字:两个 方法 参数 声明      更新时间:2023-10-16

我有两种方法可以设置构造平行四边形:

parallelogram(tiny_vec<float, 3> p1, tiny_vec<float, 3> p2, tiny_vec<float, 3> p3);
parallelogram(tiny_vec<float, 3> p1, tiny_vec<float, 3> height_vec, tiny_vec<float, 3> width_vec);

第一个从三个点中创建它并计算第四个点。第二个取一个点和两个向量,并从中计算其他三个点。但是,点和矢量都存储为 3D 矢量tiny_vec<float, 3>

有什么约定如何处理吗?将它们合并到一个方法中并添加bool use_height_and_width参数?添加一个无用的参数并给它一个默认值?

没有找到任何答案,只是相反的问题(不同的类型,一种方法)

给函数不同的名称,使参数的含义清晰。如果它们是构造函数,请改为适当地命名返回平行四边形对象的静态成员函数。

请参阅命名构造函数习惯用法。

使点和向量具有不同的类型。这也有助于捕获错误,例如将两个点加在一起。

标签调度将有助于区分正确的函数:

struct from_vecs {};
parallelogram(tiny_vec<float, 3> p1, tiny_vec<float, 3> p2, tiny_vec<float, 3> p3);
parallelogram(from_vecs, tiny_vec<float, 3> p1, tiny_vec<float, 3> height_vec, tiny_vec<float, 3> width_vec);

甚至:

struct from_points {};
struct from_vecs {};
parallelogram(from_points, tiny_vec<float, 3> p1, tiny_vec<float, 3> p2, tiny_vec<float, 3> p3);
parallelogram(from_vecs, tiny_vec<float, 3> p1, tiny_vec<float, 3> height_vec, tiny_vec<float, 3> width_vec);

否则,请使用模板函数:

enum class Tag { Points, Vecs };
template<Tag>
parallelogram(tiny_vec<float, 3>, tiny_vec<float, 3>, tiny_vec<float, 3>);

因此完全专业化:

template<>
parallelogram<Points>(tiny_vec<float, 3>, tiny_vec<float, 3>, tiny_vec<float, 3>) { }
template<>
parallelogram<Vecs>(tiny_vec<float, 3>, tiny_vec<float, 3>, tiny_vec<float, 3>) { }

稍后可以将其调用为:

parallelogram<Vecs>(/* ... params ...*/);

我见过的一个现实生活中的场景是在运行时使用枚举(或 #define 等)和调度函数。像这样:

enum f_tybe
{ 
    f1,
    f2,
    f3
}
int f(f_type ft, int a, int b)
{
    switch(ft)
    {
    case f1:
       return f1imp(a, b);
    break;
    case f2:
       return f2imp(a, b);
    break;
    case f3:
       return f3imp(a, b);
    break;
}

或者像这样添加额外的参数:

int f(int a, int b)
int f(int a, int b, void* c)

我个人在一些大型框架(winapi,directx等)中看到了这两种情况。

但最好的办法是给函数指定不同的名称。