c++ - std::bind 和函数模板

标签 c++ templates c++11 std-function stdbind

我目前正在尝试使用 std::bind创建一个 std::function<void()>来自函数模板

template<class Iterator>
void printRange(Iterator first, Iterator last) {
    std::copy(first, last, std::ostream_iterator<typename Iterator::value_type>(std::cout, " "));
    std::cout << std::endl;
}

概念上,我想要的是

int main() {
    std::vector<int> v{1, 2, 3};
    auto f0 = std::bind(printRange, v.begin(), v.end()); // won't compile, of course
    f0();
    return 0;
}

我知道这不能编译,我必须在实际使用之前实例化函数模板。例如,以下替代方案可行:

auto f1 = std::bind(printRange<std::vector<int>::const_iterator>, v.begin(), v.end());
auto f2 = std::bind(printRange<decltype(v.begin())>, v.begin(), v.end());
auto f3 = [&v]() { printRange(v.begin(), v.end()); };

我已经创建了一个便利函数

template<class Iterator>
std::function<void()> makePrintRangeFunction(Iterator first, Iterator last) {
    return std::bind(printRange<Iterator>, first, last);
}

简化流程:

auto f4 = makePrintRangeFunction(v.begin(), v.end());

我想知道是否可以创建一个更通用的 std::function<void()>生成器,接受函数模板作为第一个参数并将函数模板参数作为可变长度参数列表?如果不使用内置语言功能,也许通过宏?

最佳答案

只要你不需要有模板函数返回类型,你可以这样做:

#include <functional>
#include <iostream>
#include <typeinfo>


template<typename ... T>
std::function<void()> makePrintRangeFunction(void (*f)(T...), T... param) {
    return std::bind(f, param...);
}

template<typename T, typename V>
void print(T type, V val)
{
    std::cout << typeid(type).name() << '\n' << val << '\n';
}

int main()
{
    int i = 5;
    double d = 10.5;
    auto f = makePrintRangeFunction(print, i, d);
    f();
}

关于c++ - std::bind 和函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34901008/

相关文章:

c++ - 使用 time() 函数计算执行时间

c++ - 如何在C++中模拟按住键盘按钮

c++ - 将 constexpr class static 映射到类集合的类

c++ - 用于 g++ 编译的 C++ 文件的用户定义扩展

c++ - 带虚函数的类的大括号初始化

c++ - 类型别名和模板模板参数推导

c++ - 为什么我不能通过模板访问子类型?

c++ - 对于具有附加(非推导)模板参数的函数,ADL 失败(或未完成?)

c++ - 构建成对 vector 时出现编译器错误

c++ - 如果输出无关紧要,则不会调用函数