[英]std::bind and function templates
我目前正在嘗試使用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 ++ 14,則可以將通用lambda包裝器定義為:
template<typename F>
auto fungen(F f) {
return [=](auto... args) { f(args...); };
}
用例:
int main() {
std::vector<int> v {1, 2, 3, 4};
auto f = fungen(printRange<std::vector<int>::iterator>);
f(v.begin(), v.end());
}
也許以下代碼會有所幫助:)
template <class F, class... Args>
void test(F&& f, Args&&... args) {
std::function<typename std::result_of<F(Args...)>::type()> task(
std::bind(std::forward<F>(f), std::forward<Args>(args)...));
task();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.