C++ 模板 lambda 包装器
C++ template lambda wrapper
谁能知道如何进行编译?
我正在尝试将 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");
}
这对你有用吗?我(基本上)从 const ... &&
中删除了 const
,并向函数 youKnowWhatSomething
添加了一个模板参数。 lambda 不再在 main
.
中声明为 const
#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");
}
怎么样
#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");
}
谁能知道如何进行编译?
我正在尝试将 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");
}
这对你有用吗?我(基本上)从 const ... &&
中删除了 const
,并向函数 youKnowWhatSomething
添加了一个模板参数。 lambda 不再在 main
.
const
#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");
}
怎么样
#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");
}