我想在编译时通过类型来执行“ static dispatching”。
具体地说,有一个函数族(按类型参数化,我想根据参数的类型从该族中选择一个函数(在编译时)。
在C11
中,可以使用_Generic()
执行此操作。
例如,以下代码有效。
,但我想传递所需类型本身。(原因why在当前讨论中并不重要。假设存在此类原因。)// gcc generic.c -o generic && ./generic #include <stdio.h> void foo_int() { printf("%s\n", __func__); } // Arbitrary code to show that this works void foo_float() { printf("%s\n", __func__); } // Arbitrary code to show that this works void foo_double(){ printf("%s\n", __func__); } // Arbitrary code to show that this works #define foo_api0(VAL) \ _Generic(VAL, \ int: foo_int, \ float: foo_float, \ double: foo_double \ )() int main(){ foo_api0(2); foo_api0(4.f); foo_api0(8.); }
但是,现在假设在宏
foo_api
中,我不想传递所需类型的值
例如,代替
foo_api0(2); foo_api0(4.f); foo_api0(8.);
我想做
foo_api1(int); foo_api1(float); foo_api1(double);
一个人可以通过使用类型本身来创建辅助变量(即该类型的“见证”)来实现这一点:
#define foo_api1(TYPE) ({ \ TYPE witness; \ _Generic(witness, \ int: foo_int, \ float: foo_float, \ double: foo_double \ )(); \ })
然后两个API都起作用:
int main(){ foo_api0(2); foo_api0(4.f); foo_api0(8.); foo_api1(int); foo_api1(float); foo_api1(double); }
我的问题是:
有没有办法做到这一点不使用这样的辅助变量
?(也许在C中有一个宏/关键字可以根据类型本身而不是基于该类型的变量来执行操作?)例如,最好有这样的东西:
#define foo_api1(TYPE) ({ \
_Generic(TYPE, \
int: foo_int, \
float: foo_float, \
double: foo_double \
)(); \
})
我想在编译时通过类型进行“静态调度”。具体来说,有一个函数族(按类型参数化),我想从该族中选择一个函数(在编译时)...
通过所需的类型本身。