2012-05-31 49 views
1

我想覆蓋具有相同參數類型但具有不同邏輯含義的函數。我已經試過類似:C++中具有相同參數類型的函數過載

class T 
{ 
}; 

typedef T Age; 
typedef T Height; 
typedef T Weight; 

void foo(Age a){} 
void foo(Height a){} 
void foo(Weight a){} 

但我有構建錯誤: 錯誤C2084:函數 '無效美孚(年齡)' 已經有一個身體

一個解決辦法是:

class Age : public T{}; 
class Height : public T{}; 
class Weight : public T{}; 

但我不想只爲了這個目的用新類填充我的命名空間。

如何我可以做到這一點,而不使用派生類?

編輯:我的代碼是在CPP文件,我不使用頭。這只是一個簡單的例子。全CPP內容是在這裏:

class T 
{ 
}; 

typedef T Age; 
typedef T Height; 
typedef T Weight; 

void foo(Age a){} 
void foo(Height a){} 
void foo(Weight a){} 

int main() 
{ 
    return 0; 
} 

錯誤消息: 的.cpp(10):錯誤C2084:函數 '無效美孚(年齡)' 已經有一個身體

+0

'typedef'創建T的一個別名,即使你希望有新的類型這種填充命名空間 –

+0

,你只*有*申報新類型。 'typedef'只是爲同一類型創建一個新的*名稱*。假設'T'是一個'int' - 編譯器如何解析'foo(42)'? –

+0

@BoPersson我永遠不會用直接值調用函數。這些函數是序列化類的一部分,我需要以不同的方式序列化,具體取決於文件類型,Path對象 – Felics

回答

6

您可以使用模板爲:

//1. First define T as class template 
template<typename U> 
class T 
{ 
public: 
    typedef U tag_type; //you may need this to inspect the type 
    //... 
}; 

//2. then define some tags 
struct tag_age{}; 
struct tag_height{}; 
struct tag_weight{}; 

//3. then define typedefs 
typedef T<tag_age> Age; 
typedef T<tag_height> Height; 
typedef T<tag_weight> Weight; 

//4. then function overloads 
void foo(Age a){} 
void foo(Height a){} 
void foo(Weight a){} 

這樣,每個類型定義的是不同類型,而不能隱含轉換成其他類型的,除非你在允許這項功能明確定義類模板T

+1

STL方法:)很好,謝謝! – Felics

0

給一個嘗試BOOST_STRONG_TYPEDEF這是avalailabel在Boost.Serialization中。

+0

這將使用宏來填充名稱空間和新類。 :-) –

2

我不認爲這是類型定義一個適當的使用 - 至少concering你的榜樣,這也許是在生產代碼不同。然而,這不是什麼typedefs應該用於恕我直言。你還是命名變量和函數正確,因爲他們會做不同的邏輯的東西:

void doAge(T age); 
void doHeight(T height); 

UPDATE:哪裏的typedef合適呢?

在你的情況下,解決方案將代碼複雜化,所以它似乎相當不合適。應該使用Typedefs來簡化事情。舉個例子看看我的回答以下問題:Meaning of complex C syntax

+0

+1對*這不是什麼typedefs應該用於*。這個最簡單和最直觀的解決方案。 –

1

你在錯誤的軌道上是根本。更改實際參數的名稱而不是其類型。你在做什麼是沒有意義的。 typedef基本上使用輔助簡化名稱來與更多的代碼相關聯,但它只是程序員的簡寫,編譯器在所有情況下仍會看到T.

一些可以表示年齡,一些球,長度,高度...在所有情況下,它們的邏輯的用途是不同的,但用於編碼其信息的基本數據類型保持不變。你不應該這樣對待它。

0

您可以使用標籤來做到這一點

class T{}; 

typedef T Age; 
typedef T Height; 
typedef T Weight; 

struct age_tag {}; 
struct height_tag {}; 
struct weight_tag {}; 

void foo(Age a, age_tag){...} 
void foo(Height h, height_tag){...} 
void foo(Weight a, weight_tag){...} 

template<typename TAG> void bar(T t); 
template<> void bar<age_tag>(Age a) {...}; 
template<> void bar<height_tag>(Height h) {...}; 
template<> void bar<weight_tag>(Weight a) {...}; 
相關問題