代码拉取完成,页面将自动刷新
#include <tuple>
#include <utility>
#include <functional>
#include <iostream>
using namespace std;
template <size_t I>
struct placeholder {};
template <typename TArg,typename TFromOutterArgsTuple>
struct select_arg
{
decltype(auto) operator() (TArg arg, TFromOutterArgsTuple&)
{
return arg;
}
};
template <size_t I,typename TFromOutterArgsTuple>
struct select_arg<placeholder<I>, TFromOutterArgsTuple>
{
decltype(auto) operator() (placeholder<I>, TFromOutterArgsTuple& args)
{
return get<I>(args);
}
};
template <typename TFunc,typename ... TArgs>
class binder final
{
private:
using args = tuple<TArgs...>;
using func = decay_t<TFunc>;
func func_;
args args_;
public:
template <typename func,typename ... args>
binder(func&& f,args&& ... a):
func_{ std::forward<func>(f) },
args_{ std::forward<args>(a)... }
{}
private:
template <typename TArgsTuple,int...se>
decltype(auto) inv (func& f, args& a, TArgsTuple& t, index_sequence<se...> x)
{
return invoke(f,
select_arg<typename tuple_element<se,args>::type, TArgsTuple>{}(get<se>(a), t)...);
}
public:
template <typename ... TFromOutterArgs>
decltype(auto) operator() (TFromOutterArgs&& ... outterArgs)
{
auto argTuple = make_tuple(std::forward<TFromOutterArgs>(outterArgs)...);
auto seq = make_index_sequence<tuple_size<args>::value>();
return inv(func_,args_,argTuple,seq);
}
};
template <typename TFunc,typename ... TArgs>
auto mybind(TFunc&& f, TArgs&&...args)
{
return binder<TFunc,TArgs...> {
std::forward<TFunc>(f),
std::forward<TArgs>(args)...
};
}
int main()
{
auto f = mybind(
[](int a, float b, float c) {
return a + b + c;
},
placeholder<1>{},
1.5f,
placeholder<0>{});
const auto result = f(2.0f, 1);
cout << result << endl;
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。