我目前正在使用std::bind
從函數模板的std ::綁定和函數模板
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;
}
概念創建std::function<void()>
,我要的是
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()>
生成器,接受函數模板作爲第一個參數,函數模板參數作爲可變長度參數列表?如果不使用內置的語言功能,可能通過宏?
和拉姆達是不能接受的? – TemplateRex
是的,我發現lambda更容易編碼和讀取所有需要過去綁定的東西。 –
@TemplateRex:在這種情況下,lambda可以,但是一旦我需要俘獲不止一個變量,我認爲'std :: bind'會導致一個更具可讀性的表達式。 – Marcel