C11:对类型本身(而不是类型的实例)使用`_Generic()`(或其他内容?)>

问题描述 投票:0回答:1

我想在编译时通过类型来执行“ static dispatching”。

具体地说,有一个函数族(按类型参数化,我想根据参数的类型从该族中选择一个函数(在编译时)。

C11中,可以使用_Generic()执行此操作。

例如,以下代码有效。

// 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中,我不想传递所需类型的值

,但我想传递所需类型本身。(原因why在当前讨论中并不重要。假设存在此类原因。)

例如,代替

  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      \
  )();                      \
})

我想在编译时通过类型进行“静态调度”。具体来说,有一个函数族(按类型参数化),我想从该族中选择一个函数(在编译时)...

c generics generic-programming
1个回答
2
投票

通过所需的类型本身。

© www.soinside.com 2019 - 2024. All rights reserved.