我需要在C语言中使用_Generic,以便能够根据变量类型返回专用值。
double[] answers = new double[] { userID }.Concat(moneys).ToArray();
,以便对各种类型进行特殊处理,以返回一些字符串,但对于其余类型(默认),将返回参数本身。 “ return_param”的可能实现方式是什么?还是我必须为每种可能的类型实现专门的功能?
答案 0 :(得分:3)
您可以在通用选择分支内调用函数,然后默认分支可以简单地求值为参数的值。唯一的麻烦是所有分支必须在语义上有效。因此,我们可以在此处为标量类型做个技巧:进行另一个通用选择。如果类型正确,则按原样返回参数,否则返回0强制转换为该类型,算术类型产生0,指针类型产生空指针。该分支不会被评估,因此很安全。因此我们得到
#define coerce_scalar(type, arg) _Generic((arg), type: (arg), default: (type)0)
#define encode(x) _Generic((x), \
char *: encode_char_ptr(coerce_scalar(char *, (x))), \
const char *: encode_const_char_ptr(coerce_scalar(const char *, (x))), \
bool: encode_bool(coerce_scalar(bool, (x))), \
default: (x))
通过对用{0}
初始化的另一个分支使用复合文字,这也可以扩展为结构,并集类型-尽管大多数情况下,我猜测这将是结构的指针,即标量。
但是真正的解决方案是根本不为其他类型调用encode
。