c++如何结合std::bind和可变元组?

标签 c++ templates bind variadic-functions

相关帖子:How to combine std::bind(), variadic templates, and perfect forwarding?

有没有办法将函数与可变元组绑定(bind)?这里指示意图的错误代码:

// t is an instance of T
auto f = std::bind(&T::iterate,t,???);
// args is an instance of std::tuple<Args...> args;
std::apply(f,args);

(注意:我不确定“可变元组”是正确的术语。期待您的更正编辑帖子)

最佳答案

从 C++20 开始,您可以使用 std::bind_front :

template<class T>
void print (T val) {
    std::cout << val << std::endl;
}

struct T {
    template<class ... Args>
    void iterate(Args... args) {
        int temp[] = { (print(args),0)... };
    }
};

// all happens here
template<class ... Args>
void foo(const tuple<Args...>& args) {
    T t;
    auto f = std::bind_front(&T::iterate<Args...>,&t);
    std::apply(f,args);
}

// the call 
int i = 1;
foo(std::make_tuple(i,i+1,"bind is cool"));

如果你想使用旧的 std::bind ,您可以提供自己的占位符,从包中生成:
template<int N>
struct MyPlaceholder {};

namespace std {
    template<int N>
    struct is_placeholder<MyPlaceholder<N>> : public integral_constant<int, N> {};
}

template<class ... Args, size_t ... Indices>
void foo2helper(const tuple<Args...>& args, std::index_sequence<Indices...>) {
    T t;
    auto f = std::bind(&T::iterate<Args...>,&t, (MyPlaceholder<Indices+1>{})...);
    std::apply(f,args);
}

template<class ... Args>
void foo2(const tuple<Args...>& args) {
    foo2helper(args, std::make_index_sequence<sizeof...(Args)>{});
}
// the call
foo2(std::make_tuple(2.34,"only bind"));

Live demo

关于c++如何结合std::bind和可变元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60556718/

相关文章:

c++ - 如何从模板结构创建二维数组

c++ - 来自窗口截图的模板匹配

c++ - dll 注入(inject) - 简单的主要

c++ - 使用 decltype 转换一个值,这可能吗?

c++ - 这个 SFINAE 模式有名字吗?

nginx - (ubuntu)nginx:[emerg] bind()到0.0.0.0:80失败(13:权限被拒绝)

JavaScript - 处理 'this' 指针和自定义参数的最佳方法

c++ - 对齐列输出 C++

backbone.js - 主干开/关(拆卸)和listenTo/stopListening实现之间的区别

c++ - 使用 SFINAE 检测 constexpr