될줄 알았죠?
안돼요...ㅠㅠ
이 글을 보면 해결책이 있을줄 알았죠?
없어요...^^ 최소한 C++ 자체 라이브러리 안에서는....ㅠㅠ
아래와 같이 따로 만들면은 됩니다!
#include <iostream>
#include <memory>
#include <functional>
#include <tuple>
class Caller {
public:
virtual void run() = 0;
};
template<typename F, typename Tuple>
class Binder : public Caller
{
protected:
F f_;
std::size_t args_count_
= std::tuple_size<typename std::remove_reference<Tuple>::type>::value;
Tuple tuple_;
public:
Binder(F f, Tuple&& tuple) : f_(f), tuple_(std::move(tuple)) {
std::cout << "args_count_ : " << args_count_ << std::endl;
}
template<typename F, typename Tuple, size_t ...S >
void run_impl(F&& fn, Tuple&& t, std::index_sequence<S...>)
{
return std::forward<F>(fn)(std::get<S>(std::forward<Tuple>(t))...);
}
void run() override {
std::size_t constexpr tSize
= std::tuple_size<typename std::remove_reference<Tuple>::type>::value;
run_impl(std::forward<F>(f_),
std::forward<Tuple>(tuple_),
std::make_index_sequence<tSize>());
}
};
template<class F, class... Args>
std::unique_ptr<Caller> mybind(F&& f, Args ... args) {
return std::make_unique<Binder<F, std::tuple<Args...>>>(f, std::make_tuple(std::forward<Args>(args)...));
}
int main()
{
std::unique_ptr<std::string> temp(new std::string("TEST1234"));
std::unique_ptr<Caller> caller = mybind([](std::unique_ptr<std::string> temp, int a, int b) {
std::cout << *temp << std::endl;
}, std::move(temp), 10, 20);
caller->run();
return 0;
}
반응형
'개발 및 운영 > 프로그래밍' 카테고리의 다른 글
WIMCreateFile에서 FILE_SHARE_READ 적용하기 (WIMCreateFile분석) (0) | 2020.04.04 |
---|---|
C++에서 Node.JS 사용하기 (node모듈아님) (0) | 2019.10.21 |
std::function 복사는 비싸다! (0) | 2019.09.04 |
Ramdisk 활용법 (gradle, spring-boot, visual studio) (0) | 2019.08.01 |
C++ istream, streambuf 간단 구현 예제 (0) | 2019.07.19 |
댓글