gpt4 book ai didi

c++ - 使用条件调用模板函数

转载 作者:行者123 更新时间:2023-11-30 02:38:23 25 4
gpt4 key购买 nike

给定一个模板类型的函数:

template<typename TYPEA, typename TYPEB, typename TYPEC> 
void foo (TYPEA a, TYPEB b, TYPEC c) { ...; }

那么我希望通过如下方式调用这个函数:

int main (void) {
int ta = 32;
int tb = 64;
int tc = 32;

float *array_a;
double *array_b;
float *array_c;

foo<(ta == 32 ? float : double), (tb == 32 ? float : double), (tc == 32 ? float : double)>(array_a, array_b, array_c);

return 0;
}

当然,这段代码会导致编译错误...

但是,我只是想知道是否有一种方便的方法来检查 ta、tb 和 tc 的值并相应地调用函数 foo...

最佳答案

首先,根据变量的值和条件运算符选择用于实例化模板的类型在语法上是错误的。语言不允许通过该方法选择类型。

其次,你可以让编译器推导出类型。你可以只使用:

foo(array_a, array_b, array_c);

编译器会将TYPEA推导为float*,将TYPEB推导为double*,并将TYPECfloat*

使用

foo<float, double, float>(array_a, array_b, array_c);

不正确,因为用于实例化模板的类型与参数类型不匹配。

第三,如果您希望能够根据值派生类型,则该值必须是constconstexpr。您可以使用:

template <int N> struct TYPE_Chooser { using type = double; };
template <> struct TYPE_Chooser<32> { using type = float; };

int main ()
{
const int ta = 32;
const int tb = 64;
const int tc = 32;

using typea = typename TYPE_Chooser<ta>::type;
using typeb = typename TYPE_Chooser<tb>::type;
using typec = typename TYPE_Chooser<tc>::type;

foo<typea, typeb, typec>(10, 20, 30);

return 0;
}

关于c++ - 使用条件调用模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com