2016-07-07 79 views
3

我有兩種方法來設定該構建體的平行四邊形兩種不同的方法:聲明其使用相同的參數

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

回答

5

提供的功能不同的名字,這使得該參數的含義清晰。如果它們是構造函數,則使它們適當地命名爲返回平行四邊形對象的靜態成員函數。

查看Named Constructor Idiom

3

請點和載體不同的類型。這也有助於發現諸如將兩點加在一起的錯誤。

+0

但它們的表現完全相同......添加2點也是有意義的,因爲您可以添加/減去位置向量。 – PattuX

+1

@PattuX不,加兩點是沒有意義的。如果你以座標方式添加它們,你實際上將一個或另一個視爲一個向量。 – Brian

+0

是的,但是我可以寫'tiny_vec pv_vec = point - tiny_vec (0.0f,0.0f,0.0f)'每次你可以「添加」2點會變得很難看。 無論如何,這種變化的程度現在會太大,但我會在下一次考慮。 :) – PattuX

2

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

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

但最好的辦法是給功能不同的名稱。