【发布时间】:2016-04-26 08:32:29
【问题描述】:
我目前正在尝试使用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()> 生成器,接受函数模板作为第一个参数,函数模板参数作为可变长度参数列表?如果不使用内置语言功能,也许通过宏?
【问题讨论】:
-
并且不能接受 lambda?
-
是的,fwiw,我发现 lambdas 对于过去需要
bind的所有事情都更容易编码和阅读。 -
@TemplateRex:在这种情况下,lambda 是可以的,但是一旦我需要捕获多个变量,我认为
std::bind会产生一个更具可读性的表达式... -
@Marcel,只需使用一个非常“薄”的 lambda,它会立即调用实际函数。这将与绑定一样可读。如果您想查看示例,请告诉我。
标签: c++ templates c++11 std-function stdbind