声明其使用相同的参数
我有两种方法来设定该构建体的平行四边形两种不同的方法:声明其使用相同的参数
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
参数? 添加一个无用的参数给一个,并给它一个默认值?
还没有找到任何答案,正好相反的问题(不同的类型,一种方法)
tag分派将有助于识别正确的函数:
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 ...*/);
这似乎是一件非常奇怪的事情。如果你将不得不输入'parallelogram(from_vec,...',为什么不只是重命名函数'parallelogram_from_vec'? –
@BenjaminLindley ...更改名称的功能?我同意,这就是为什么我upvoted你的答案,但我想这不是OP想要做的,所以,这里有一个选择。:-) – skypjack
我见过的真实生活场景是在运行时使用枚举(或#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的,等等)。
但最好的办法是给功能不同的名称。
typedef不同的tiny_vecs – pm100