這是我在C做的事情,以環繞任何功能。我希望它能幫助/激勵你。 主要的限制是你只能圍繞用戶定義的函數進行換行,因爲你將不得不修改函數的簽名。
我的解決方案使用va_arg結構。
#include <stdarg.h>
void * super_wrapper(void * (*fn)(), void * ret, int n, ...)
{
va_list = my_list;
va_start(my_list, n);
ret = (*fn)(ret, n, my_list);
va_end(my_list);
return ret
}
包裝的簽名採用指針要執行的功能,指針給函數來獲取你的回報價值,悠逸的參數個數調用函數,然後你想要調用的函數的參數。
va_list是參數列表。 你用va_start初始化它。 va_start的第一個參數是你想要初始化的va_list。第二個參數是當前函數的最後一個已知參數(在本例中爲'n')。
現在,您將使用自定義函數中的省略號而不是va_list。我
兩個例子有:
double sum (int n, ...)
{
int i;
double res = 0;
double tmp;
va_list = my_list;
va_start(my_list, n);
for(i=0; i<n; i++)
{
tmp = va_arg(my_list, double);
res += tmp;
}
va_end(my_list);
return res;
}
void my_print(int n, ...)
{
int i;
va_list my_list;
va_start(my_list, n);
char * tmp;
for(i=0; i<n; i++)
{
tmp = va_arg(my_list, char *);
printf("%s ", tmp);
}
printf("\n");
va_end(my_list);
}
我設法使用相同的包裝來調用這個兩個不同的功能與簽名,並在函數體一些修改。 問題是,在參數和回報中,我只給出指針。所以我必須解除指針的引用。
void * sum (void * ret, int n, va_list my_list)
{
int i;
double res = 0;
double *tmp;
for(i=0; i<n; i++)
{
tmp = va_arg(my_list, double);
res += *tmp;
}
ret = &res;
return ret;
}
void* my_print(int n, ...)
{
int i;
char ** tmp;
for(i=0; i<n; i++)
{
tmp = va_arg(my_list, char **);
printf("%s ", *tmp);
}
printf("\n");
return ret;
}
現在我可以使用相同的包裝函數在我的主要調用這兩個函數:
void main()
{
double two = 2.0;
double three = 3.0;
double fifteen = 15.0;
char *I, *am, *a, *great, *wrapper;
I = malloc(sizeof(char) * 2);
am = malloc(sizeof(char) * 3);
a = malloc(sizeof(char)*2);
great = malloc(sizeof(char) * 6;
wrapper = malloc(sizeof(char) * 8);
I = strcpy(I, "I\0");
am = strcpy(am, "am\0");
a = strcpy(a,"a\0");
great = strcpy(great, "great\0");
wrapper = strcpy(wrapper, "wrapper\0");
void * ret;
printf("Sum = %f\n", *((double*)super_wrapper(sum, ret, 3, &two, &three, &fifteen)));
super_wrapper(my_print, ret, 5, &I, &am, &a, &great, &wrapper);
}
你熟悉的std ::功能,什麼編譯和版本?增強可用嗎? – Zac 2012-07-21 06:55:17
你想用你的包裝完成什麼?我不明白爲什麼要包裝任何東西。 – Adam 2012-07-21 07:43:23
@Zac,我看着std :: function。看起來好像我仍然需要指定一個確切數量的輸入參數才能與另一個函數一起使用。我在Ubuntu上工作。我在終端上運行了g ++ --version,它告訴我4.6.1。是的。 Boost可用。我聽說它可能對我想要做的事有用。 – 2012-07-21 23:12:55