Mar*_*cel 5 c++ templates stdbind c++11 std-function
我目前正尝试使用功能模板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;
}
Run Code Online (Sandbox Code Playgroud)
从概念上讲,我想要的是
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;
}
Run Code Online (Sandbox Code Playgroud)
我知道这不能编译,因此我必须实例化函数模板才能真正使用它。例如,以下替代方法将起作用:
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()); };
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个便利功能
template<class Iterator>
std::function<void()> makePrintRangeFunction(Iterator first, Iterator last) {
return std::bind(printRange<Iterator>, first, last);
}
Run Code Online (Sandbox Code Playgroud)
简化流程:
auto f4 = makePrintRangeFunction(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能创建一个更通用的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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1313 次 |
| 最近记录: |