看了這篇 C11 - Generic Selections。
第一直覺感覺和C++ Template很像,不過也不太一樣。
這是C11的Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h> void funci(int x) { printf("func value = %d\n", x); } void funcc(char c) { printf("func char = %c\n", c); } void funcdef(double v) { printf("Def func's value = %lf\n", v); } #define func(X) _Generic((X), int: funci, char: funcc, default: funcdef)(X) int main() { func(1); func('a'); func(1.3); return 0; }
|
輸出結果是
1 2 3
| func value = 1 func value = 97 Def func's value = 1.300000
|
相似的C++程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| template <typename T> void func(T v) { cout << "Def func's value = " << v << endl; } template <> void func<int>(int x) { printf("func value = %d\n", x); } template <> void func<char>(char c) { printf("func char = %c\n", c); }
|
對照結果,對於Character的Match不相同。會Cast成int型態。
1 2 3
| func value = 1 func char = a Def func's value = 1.3
|
除非寫成這樣
而文章中不能判斷const/volatile
的部份被修改了,行為現在跟C++一樣。
C Community跟C++ Community攜手合作之後,C11跟C++11真多地方相像。