Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 绑定和函数模板_C++_Templates_C++11_Std Function_Stdbind - Fatal编程技术网

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();
}