C _泛型:将多个类型转换为单个值?

C _泛型:将多个类型转换为单个值?,c,generics,generic-programming,c11,C,Generics,Generic Programming,C11,使用c11\u Generic是否有办法将多个类型映射到单个值 例如: 有没有办法将类型分组?(这不是仅用于表达意图的有效语法) 我问这个问题的原因是argsfoo和baz最终可能会成为大型表达式(不一定能重构为函数),因此有一种避免大量重复的方法是很好的 注: 如果没有支持的方法使用\u Generic,我可以制作一个varargs宏,将多个arg粘到一个值上 #define GENERIC_TYPE_GLUE3(answer, arg0, arg1) \ arg0: answer

使用c11
\u Generic
是否有办法将多个类型映射到单个值

例如:

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


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


注:

如果没有支持的方法使用
\u Generic
,我可以制作一个varargs宏,将多个arg粘到一个值上

#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
....
。。。有许多这样的宏,然后使用varargs包装器自动使用正确的宏,请参见:


(参见工作示例:)

对于您的用例,您可以使用类型提升规则

_Generic((e)+0ULL,             \
    unsigned long long:   foo, \
    default:  bar)
如果您有浮点以外的情况,您甚至可以更进一步

_Generic((e)+0ULL,             \
    unsigned long long:   foo, \
    default: _Generic((e)+0.0L,\
     long double:   bar,       \
     default:  blur))
这假设所有表达式
e
都有算术类型。然后,中的
默认值
剩下的将是
\u复杂的
类型和所有指针类型


不管怎样,对于您心目中的那种用法,您应该进行这样的升级,因为编译器目前对
\u Generic
的控制表达式的解释是不同的。例如,也可以考虑类型<代码>双const >不同于<代码>双< /代码>的对象。因此,如果您必须区分所有可能的类型资格,这将给您大量的案例考虑。

不,类似于<代码> Switter >没有语法可预定义用于<代码>泛型< /代码>的多个案例。那么,您的重组宏方法可能正适合您的目的。您可以看看boost或my package所做的宏元编程,它只允许您有一个这样的宏,也可以计算实例。

我从来没有真正研究过通用宏是如何工作的,但是如果您为巨人
foo
baz
表达式定义了新的宏会怎么样?有什么东西阻止它工作吗?在大多数情况下,这会起作用,这只意味着一次性使用的宏的数量可能会成倍增加(并污染名称空间)。我宁愿使用示例宏将多个类型与单个参数粘合在一起。示例中可以使用的事实类型提升与实际问题无关(不是理想的示例),请编辑示例。
_Generic(e,      \
    GENERIC_TYPE_GLUE(foo_expression, short int, long),
    GENERIC_TYPE_GLUE(bar_expression, float, double))
_Generic((e)+0ULL,             \
    unsigned long long:   foo, \
    default:  bar)
_Generic((e)+0ULL,             \
    unsigned long long:   foo, \
    default: _Generic((e)+0.0L,\
     long double:   bar,       \
     default:  blur))