2010-08-25 79 views
2

是否有任何技巧可以獲取傳入參數的類型而不顯式聲明字符串中的類型作爲參數之一?在可變參數函數中獲取傳入參數的類型

要在後添加剛纔,基本上是我想要做的就是

如果是A型

呼叫泛函

否則,如果是B型

呼叫functionB。

可變模板能解決嗎?

謝謝。

+0

在概念層面上,所有可變參數函數都做一個參數列表,並用'void *'指向它們。然後你到列表中並將其轉換回適當的類型。沒有類型信息。只是一個地址。因此,您需要通過非可變參數指定類型,或者執行一些沉重的樣板代碼以安全的方式對類型信息進行編碼(可能不是很乾淨)。 – GManNickG 2010-08-25 08:33:47

+1

這是因爲API不可能像boost格式使用'%'以類型安全的方式接受可變數量的參數。 – 2010-08-25 08:35:10

回答

3

不,如果它們的類型可能不同,則需要傳遞某種結構來指定這些類型。

另請注意,只允許某些類型,並且最好將其限制爲指針。

Variadic 模板解決此問題。不過,你需要一個更新的編譯器,模板需要存在於頭文件中。爲每個唯一的參數類型序列生成一個單獨的函數。

3

一個可變參數模板無疑解決了這個:

#include <cstdio> 

void function_a(int a) { printf("int %d\n", a); } 
void function_b(double b) { printf("double %f\n", b); } 

void select(int n) { function_a(n); } 
void select(double d) { function_b(d); } 

template <class T> 
void variadic(T a) 
{ 
    select(a); 
} 

template <class T, class ...Args> 
void variadic(T a, Args... args) 
{ 
    select(a); 
    variadic(args...); 
} 

int main() 
{ 
    variadic(1, 3, 2.1, 5.6, 0); 
} 

但是,這僅僅是C++ 0x中可用。

如果您的意思是可變參數函數在var_args中,那麼這些參數不會攜帶任何類型信息。