C++ 绑定和函数模板
我目前正在尝试使用C++ 绑定和函数模板,c++,templates,c++11,std-function,stdbind,C++,Templates,C++11,Std Function,Stdbind,我目前正在尝试使用std::bind从函数模板创建std::function 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:
std::bind
从函数模板创建std::function
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
生成器,接受函数模板作为第一个参数,函数模板参数作为可变长度参数列表?如果不使用内置语言功能,可能通过宏?如果编译器支持C++14,则可以将通用lambda包装定义为:
template<typename F>
auto fungen(F f) {
return [=](auto... args) { f(args...); };
}
模板
汽车风琴(F){
返回[=](自动…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());
}
intmain(){
std::向量v{1,2,3,4};
自动f=芬根(打印范围);
f(v.begin(),v.end());
}
也许下面的代码会有所帮助:)
模板
无效测试(F&&F,参数&&…参数){
函数任务(
std::bind(std::forward(f),std::forward(args)…);
任务();
}
只要不需要模板函数返回类型,就可以执行以下操作:
#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();
}
#包括
#包括
#包括
模板
函数makePrintRange函数(void(*f)(T…),T…,param){
返回std::bind(f,param…);
}
模板
无效打印(T型,V值)
{
std::cout和lambda是不可接受的?是的,fwiw,我发现lambda对于过去需要bind
的所有东西来说都非常容易编码和读取。@TemplateRex:在这种情况下lambda是可以的,但是一旦我需要使用不止一个变量,我想std::bind
就会产生一个我想要的表达式更具可读性…可能是@Marcel的副本,只需使用一个非常“瘦”的lambda,它会立即调用实际函数。这将与bind一样可读。如果您想看一个示例,请告诉我。哦,我不太明白,我想第二个答案是您想要的。我不知道您的解决方案与auto f1=std::bind(printRange,v.begin(),v.end());
还是我遗漏了什么?OP似乎希望编译器从函数参数推断模板参数。用例:auto f=fungen(printRange,v.begin(),v.end())
。遗憾的是,模板模板只能与类类型一起工作,我不知道是否有可能在这种情况下扭曲模板参数推断。@Revolver\u Ocelot:…如果我使用类类型,我将不得不再次显式地显示模板参数,对吗?这正是我想要的!非常感谢!
auto f4 = makePrintRangeFunction(v.begin(), v.end());
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();
}
#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();
}