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

时间:2016-07-07 22:13:02

标签: c++

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

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参数? 添加一个无用的参数给一个并给它一个默认值?

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

4 个答案:

答案 0 :(得分:5)

为函数指定不同的名称,使参数的含义清晰。如果它们是构造函数,则使它们适当地命名为返回并行图对象的静态成员函数。

请参阅Named Constructor Idiom

答案 1 :(得分:3)

制作点和矢量不同的类型。这也有助于捕获错误,例如一起添加两个点。

答案 2 :(得分:2)

标签调度有助于区分正确的功能:

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 ...*/);

答案 3 :(得分:0)

我见过的真实场景是在运行时使用枚举(或#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等)。

但最好的想法是赋予函​​数不同的名称。