我有一个函数需要两个 std::function
s 作为参数。第二个函数的参数与第一个函数的结果类型相同。
我写了一个这样的函数模板:
template<typename ResultType>
void examplFunction(std::function<ResultType()> func, std::function<void(ResultType)> func2) {
auto x = func();
func2(x);
}
我可以这样调用它:
void f() {
examplFunction<int>([]() { return 1; }, //
[](int v) { std::cout << "result is " << v << std::endl; });
}
有没有办法摆脱 <int>
在 examplFunction<int>
并让编译器推断 ResultType
的类型?
最佳答案
你真的需要 std::function
吗?当您需要类型删除时,std::function
很有用。使用模板,您通常可以完全跳过它:
template<class F1, class F2>
void examplFunction(F1 func, F2 func2, decltype(func2(func()))* sfinae = nullptr) {
auto x = func();
func2(x);
}
sfinae
参数确保该函数只能被函数调用,使得 func2
可以被 func
的结果调用。
关于从 lambda 推导 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52225371/