我一直在四处寻找SO,但是找不到我一直在寻找的答案-这个问题可能最接近我的想法。
一句话:是否可以声明一个模板函数,该模板函数采用an的std::function
参数并为该函数的返回类型和参数类型推导出模板参数?例:
//this works to pass the std::function in
template<class T>
void doSomething(std::function<T> f) {
f();
}
//this is more what i am looking for - can R and P be deduced automatically - does not work!
template<class R, class P>
void doSomethingElse(std::function<R(P)> f) {
f();
}
这是因为函数签名或函数类型本身被视为一件事情,因此不能被“分解”吗?我知道有decltype
,std::result_of
但无法思考如何在这里使用它们。
另外,如何使用可变参数模板将第二个示例扩展为具有多个参数和推导?
template<class R, class P>
void doSomethingElse(std::function<R(P)> f) {
f(P{});
}
可以,但是仅当您将a传递std::function
给该函数并且该函数具有一个非void参数时才有效。不过,这是一种限制。您可以使用
template<class R, class... Args, class... Ts>
void doSomethingElse(std::function<R(Args...)> f, Ts&&... args) {
f(std::forward<Args>(args)...);
}
它将接受任何std::function
和参数,并像在呼叫站点中一样进行调用。不过,这仍然是有限制的,因为致电网站要求您使用,std::function
因此您无法将任何可隐式转换为的内容传递给std::function
。
使用C ++ 17和类模板参数推论(CTAD)时,这不再是问题。我们可以创建一个可以接受任何类型的重载,然后使用CTAD构造一个std :: function来为我们填充类型。看起来像
template<class Func, class... Args>
void doSomethingElse(Func&& f, Args&&... args) {
doSomethingElse(std::function{std::forward<Func>(f)}, std::forward<Args>(args)...);
}
template<class R, class... Args, class... Ts>
void doSomethingElse(std::function<R(Args...)> f, Ts&&... args) {
f(std::forward<Args>(args)...);
}
现在,不是a的所有内容std::function
都将转到void doSomethingElse(Func&& f, Args&&... args)
,转换为std::function
,然后传递给,void doSomethingElse(std::function<R(Args...)> f, Args&&... args)
因此您可以在其中使用返回类型和参数类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句