【发布时间】:2021-04-24 22:19:07
【问题描述】:
我正在尝试创建一个函数,调用者可以在其中传入带有一组已知参数的 lambda(返回类型可以是调用者想要的任何东西) 假设可能的 lambda 签名是
- T(小部件*)
- T (Widget2*)
我已经尝试了几件事,但我无法让它们中的任何一个工作
struct Widget2{
int count = 0;
};
class Widget {
public:
template<typename Fn, typename T = std::invoke_result_t<Fn, Widget*>>
T doIt(Fn&& fn)
{
return fn(_sibling);
}
template<typename Fn, typename T = std::invoke_result_t<Fn, Widget2*>>
T doIt(Fn&& fn)
{
return fn(_other);
}
private:
Widget* _sibling = nullptr;
Widget2* _other = nullptr;
};
我也尝试过这样做
template<typename Fn>
auto doIt(Fn&& fn)
{
if (std::is_invocable_v<Fn, Widget*>)
return fn(_sibling);
else if (std::is_invocable_v<Fn, Widget2*>)
return fn(_other);
}
编译器中的这段代码:https://wandbox.org/permlink/wMAuw5XXnc0zTjlk
我宁愿避免添加doItWidget1、doItWidget2等多个函数。
有没有一种方法可以让我根据传入的 lambda 参数重载函数?
【问题讨论】:
标签: c++ templates overloading