2015-06-02 61 views
1

是否可以只允許特定的typedef作爲函數參數?僅允許將特定的`typedef`作爲函數參數

typedef int foo; 
typedef int goo; 

void f(goo g); //I don't want to accept anything `foo` as an argument 

如果無法簡單地用typedef,我可以用什麼語言結構來達到這個效果?

+1

使用'struct goo {.....};'而不是定義任何轉換構造函數 –

+0

如何傳遞'foo任何辦法? 'f(1)'好嗎?實際的參數將是一個表達式,而不是一個標識符。 – MSalters

+0

或者使用'enum class goo {....};' –

回答

5

不,它們不是不同的類型,只是同一類型的不同名稱。

如果你想他們是不同類型的,你可以將它們定義爲結構:

struct foo 
{ 
    explicit foo(int v) : value(v) {} 
    int value; 
}; 

struct goo 
{ 
    explicit goo(int v) : value(v) {} 
    int value; 
}; 

void f(goo g); 

// ... 

foo a(23); 
goo b(34); 
f(b); // good 
f(a); // bad 
f(goo(45)); // good 
f(foo(56)); // bad 

或者你可以templateify:

template<typename T, typename tag> 
struct newtype 
{ 
    explicit newtype(const T& v) : value(v) {} 
    T value; 
}; 

struct foo_d {}; 
struct goo_d {}; 
typedef newtype<int, foo_d> foo; 
typedef newtype<int, goo_d> goo; 
0

的爭論有一個類型,該功能允許任何參數在你的情況下聲明爲int的類型,請嘗試使用類/結構體

相關問題