gpt4 book ai didi

c++ - 在不知道其元数的情况下绑定(bind)函数的第一个参数

转载 作者:可可西里 更新时间:2023-11-01 17:39:02 25 4
gpt4 key购买 nike

我想要一个函数 BindFirst 来绑定(bind)函数的第一个参数,而无需使用 std::placeholders 明确知道/声明函数的元数。我希望客户端代码看起来像那样。

#include <functional>
#include <iostream>

void print2(int a, int b)
{
std::cout << a << std::endl;
std::cout << b << std::endl;
}

void print3(int a, int b, int c)
{
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << c << std::endl;
}

int main()
{
auto f = BindFirst(print2, 1); // std::bind(print2, 1, std::placeholders::_1);
auto g = BindFirst(print3, 1); // std::bind(print3, 1, std::placeholders::_1, std::placeholders::_2);
f(2);
g(2,3);
}

关于如何实现 BindFirst 有什么想法吗?

最佳答案

:

#include <type_traits>
#include <utility>

template <typename F, typename T>
struct binder
{
F f; T t;
template <typename... Args>
auto operator()(Args&&... args) const
-> decltype(f(t, std::forward<Args>(args)...))
{
return f(t, std::forward<Args>(args)...);
}
};

template <typename F, typename T>
binder<typename std::decay<F>::type
, typename std::decay<T>::type> BindFirst(F&& f, T&& t)
{
return { std::forward<F>(f), std::forward<T>(t) };
}

DEMO

:

#include <utility>

template <typename F, typename T>
auto BindFirst(F&& f, T&& t)
{
return [f = std::forward<F>(f), t = std::forward<T>(t)]
(auto&&... args)
{ return f(t, std::forward<decltype(args)>(args)...); };
}

DEMO 2

关于c++ - 在不知道其元数的情况下绑定(bind)函数的第一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33724042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com