誰能弄清楚如何編譯?
我正在嘗試將 lambda 包裝在另一個函式中,該函式執行某些操作(此處列印“你知道什么”) 呼叫 lambda。
最好是自動扣除模板引數。
#include <iostream>
#include <functional>
#include <utility>
void youKnowWhat(const std::function<void()>&& fun)
{
std::cout << "You know what ?" << std::endl;
fun();
}
template <typename... Args>
auto youKnowWhatSomething(const std::function<void(Args...)>&& fun)
{
return [fun{std::move(fun)}](Args... args)
{
youKnowWhat(std::bind(fun, std::forward<Args>(args)...));
};
}
int main()
{
const auto imHavingSomething([](const std::string& s){
std::cout << "Im having " << s << std::endl;
});
const auto youKnowWhatImHavingSomething(youKnowWhatSomething(std::move(imHavingSomething)));
youKnowWhatImHavingSomething("fun with templates");
youKnowWhatImHavingSomething("headaches");
}
uj5u.com熱心網友回復:
怎么樣
#include <iostream>
#include <functional>
#include <utility>
template <typename F>
void youKnowWhat(F&& fun)
{
std::cout << "You know what ?" << std::endl;
fun();
}
template <typename F>
auto youKnowWhatSomething(F&& fun)
{
return [fun{std::move(fun)}](auto... args) -> decltype(fun(std::forward<decltype(args)>(args)...), void())
{
youKnowWhat([&](){fun(std::forward<decltype(args)>(args)...); });
};
}
int main()
{
const auto imHavingSomething([](std::string s){
std::cout << "Im having " << s << std::endl;
});
const auto youKnowWhatImHavingSomething(youKnowWhatSomething(imHavingSomething));
youKnowWhatImHavingSomething("fun with templates");
youKnowWhatImHavingSomething("headaches");
}
演示
uj5u.com熱心網友回復:
這對你有用嗎?我(基本上)洗掉了constfrom const ... &&,并在 function 中添加了一個模板引數youKnowWhatSomething。lambda 不再宣告為constin main。
#include <iostream>
#include <functional>
#include <utility>
void youKnowWhat(const std::function<void()>& fun)
{
std::cout << "You know what ?" << std::endl;
fun();
}
template<typename function_t, typename... Args>
auto youKnowWhatSomething(function_t&& fun)
{
return [fun{std::move(fun)}](Args... args)
{
youKnowWhat(std::bind(fun, std::forward<Args>(args)...));
};
}
int main() {
auto imHavingSomething = [](std::string s) {
std::cout << "Im having " << s << std::endl;
};
const auto youKnowWhatImHavingSomething =
youKnowWhatSomething<decltype(imHavingSomething), std::string>
(std::move(imHavingSomething));
youKnowWhatImHavingSomething("fun with templates");
youKnowWhatImHavingSomething("headaches");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437755.html
