gpt4 book ai didi

c++ - 将函数指针传递给函数时处理

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:18 24 4
gpt4 key购买 nike

让我们考虑一下:

void goo () {
std::cout << "void goo ()\n";
}

int goo (int) {
std::cout << "int goo (int)\n";
return 42;
}

现在我想使用如下定义的一些包装函数来调用其中一个函数:

template <typename F, typename... A>
void c (F&& f, A&&... a) {
f (std::forward<A> (a)...);
}

使用方法:

c (&goo, 10); // (X)
c (&goo); // (Y)

两种情况都失败(GCC 5.3.1)并出现相应的错误:

error: no matching function for call to ‘c(<unresolved overloaded function type>, int)’
error: no matching function for call to ‘c(<unresolved overloaded function type>)’

就我而言,失败是因为编译器在必须初始化 f 对象时无法选择适当的重载(信息太少)。

作为一种解决方案,我当然可以像这样编写使用调用:

c (static_cast<int (*) (int)> (&goo), 10);
c (static_cast<void (*) ()> (&goo));

告诉编译器我真正想使用哪个指针。

为我编写这个 static_cast 使代码更丑陋,所以我编写了一个包装函数,用于使用模板将函数指针转换为适当的指针:

template <typename R, typename... Args>
using Funptr_t = R (*) (Args...);

template <typename R, typename... Args>
Funptr_t<R, Args...> funptr (Funptr_t<R, Args...> ptr) {
return static_cast<Funptr_t<R, Args...>> (ptr);
}

现在用法看起来好多了:

c (funptr<int, int> (&goo), 10);
c (funptr<void> (&goo));

我的问题是:对于如何处理这种情况,您有更好的想法吗?我很确定这种情况在通用代码中经常发生。所以,请给我一些建议。

理想的解决方案是如果我可以直接使用 (X) 和 (Y),那么指向适当重载的魔术将使用 A... 完成并隐藏给调用者。

最佳答案

我的意思是,您始终可以明确指定模板参数:

c<int(int)>(&goo, 10);
c<void()>(&goo);

据我所知,在 c 中无法做到这一点,因为无法推断出 F(重载之间存在歧义),并且无法让编译器推断出正确的类型,您需要在调用方更改某些内容。

关于c++ - 将函数指针传递给函数时处理 <unresolved overloaded function type>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46024823/

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