我有两种方法可以将构造设置为平行四边形:
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
参数?
添加一个无用的参数给一个并给它一个默认值?
没有找到任何答案,只是相反的问题(不同的类型,一种方法)
答案 0 :(得分:5)
为函数指定不同的名称,使参数的含义清晰。如果它们是构造函数,则使它们适当地命名为返回并行图对象的静态成员函数。
答案 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等)。
但最好的想法是赋予函数不同的名称。