2015-06-02 3 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)' OK? Фактическим аргументом будет выражение, а не идентификатор. – 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 в вашем случае, попробуйте классы/структуры вместо

Смежные вопросы