gpt4 book ai didi

c++ - 如何将多个函数重载作为单个参数传递?

转载 作者:可可西里 更新时间:2023-11-01 17:34:22 25 4
gpt4 key购买 nike

这是另一个试图摆脱宏的例子。考虑

void f_(int i) { printf("f_(int)\t%d\n", i); }
void f_(int i, double x) { printf("f_(int, double)\t%d, %5.3f\n", i, x); }
void g_(int i) { printf("g_(int)\t%d\n", i); }
void g_(int i, double x) { printf("g_(int, double)\t%d, %5.3f\n", i, x); }

(假设 f_().foo 文件获取数据或使用硬编码的“虚拟”值,g_() 确实.bar 也一样。)可能有一个函数来决定调用哪个重载:

void f(int i, double d) { (i > 0) ? f_(i, d) : f_(i); }

g_() 复制相同的逻辑:

void g(int i, double x) { (i > 0) ? g_(i, x) : g_(i); }

使用宏很容易摆脱重复的代码:

#define h(i, x, func_) (i > 0) ? func_(i, x) : func_(i);
// ...
h(-1, 314.1, f_);
h(99, 314.1, f_);
h(-1, 314.1, g_);
h(99, 314.1, g_);

但是我们当然不希望在 C++ 中使用宏。 “显而易见”的模板

template<typename T>
void h2(int i, double x, T t)
{
(i > 0) ? t(i, x) : t(i);
}
// ...
h2(-1, 314.1, f_);

失败是因为编译器无法确定要使用的 f_() 重载。

如何替换宏 h 的功能?

最佳答案

您可以使用可变参数 lambda 并让 lambda 调用您希望调用的函数。

template<typename T>
void h2(int i, double x, T t)
{
i > 0 ? t(i, x) : t(i);
}

int main()
{
h2(-1, 314.1, [](auto... args){ f_(args...); });
// ^^ change this to g_ if you want to use g_ instead of f_
}

关于c++ - 如何将多个函数重载作为单个参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51842974/

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