c - _通用 : multiple types to a single value?

标签 c generics generic-programming c11

使用 c11 _Generic 有没有办法将多个类型映射到一个值?

例如:

_Generic(e,      \
    A *:    foo_expression, \
    B **:   foo_expression, \
    C:      foo_expression, \
    enum D: bar_expression, \
    void *: bar_expression)

有没有办法对类型进行分组? (这不是仅用于表达意图的有效语法)

_Generic(e, \
    A *: B **: C:    foo_expression, \
    enum D: void *:  bar_expression)

我问的原因是 args foobaz 最终可能成为大型表达式(不一定能重构为函数) , 因此最好有一种避免大量重复的方法。


注意:

如果不支持使用 _Generic 的方法,我_可以_制作一个可变参数宏来将多个参数粘合到一个值...

#define GENERIC_TYPE_GLUE3(answer, arg0, arg1) \
    arg0: answer, arg1: answer
#define GENERIC_TYPE_GLUE4(answer, arg0, arg1, arg2) \
    arg0: answer, arg1: answer, arg2: answer
....

... 有许多这样的宏,然后使用可变参数包装器自动使用正确的宏,请参阅:https://stackoverflow.com/a/24837037/432509

_Generic(e,      \
    GENERIC_TYPE_GLUE(foo_expression, short int, long),
    GENERIC_TYPE_GLUE(bar_expression, float, double))

(参见工作示例:https://gist.github.com/ideasman42/4426f255880ff6a53080)

最佳答案

不,与 switch 类似,没有预见到可以为 _Generic 重新组合多个案例的语法。那么,您的重组宏方法可能是适合您目的的正确方法。您可以查看由 boost 或我的包 P99 完成的宏元编程。这允许您只有一个这样的宏,它还可以计算案例的数量。

关于c - _通用 : multiple types to a single value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29874040/

相关文章:

c - 我的代码返回 0 实际上它应该返回输入的相反值

java - 以参数化类型作为参数返回不同类型对象列表的方法

java - 使用泛型类作为 java List 的类型

go - 如何从golang的 map 中统一获取 key 片?

c - 填充 va_list

c - 使用第一个元素作为枢轴的 C 中的快速排序实现

c - Linux 套接字/段错误

c# - 使用 foreach 遍历通用列表并将值添加到列表<DTO>

java - 无法构造泛型类型参数,该怎么办?

haskell - 如何表达数据值的独立组合的模式匹配?