声明其使用相同的参数

问题描述:

我有两种方法来设定该构建体的平行四边形两种不同的方法:声明其使用相同的参数

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

typedef不同的tiny_vecs – pm100

提供的功能不同的名字,这使得该参数的含义清晰。如果它们是构造函数,则使它们适当地命名为返回平行四边形对象的静态成员函数。

查看Named Constructor Idiom

请点和载体不同的类型。这也有助于发现诸如将两点加在一起的错误。

+0

但它们的表现完全相同......添加2点也是有意义的,因为您可以添加/减去位置向量。 – PattuX

+1

@PattuX不,加两点是没有意义的。如果你以坐标方式添加它们,你实际上将一个或另一个视为一个向量。 – Brian

+0

是的,但是我可以写'tiny_vec pv_vec = point - tiny_vec (0.0f,0.0f,0.0f)'每次你可以“添加”2点会变得很难看。 无论如何,这种变化的程度现在会太大,但我会在下一次考虑。 :) – PattuX

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

这似乎是一件非常奇怪的事情。如果你将不得不输入'parallelogram(from_vec,...',为什么不只是重命名函数'parallelogram_from_vec'? –

+0

@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的,等等)。

但最好的办法是给功能不同的名称。