传递给函数的动态大小的模板化参数数组

时间:2018-06-10 15:22:46

标签: c++ c++11 templates metaprogramming template-meta-programming

我一直试图找到一种方法来制作一个能够接收任何变量及其动态数量的函数的函数。

这个功能的原因是因为我包装了std :: function而我想调用我持有的std :: function但是我拥有动态值。

班级示例:

class Task {

     public:
         //C'tor init etc...
         Task(Dynamic array of values to be saved in a vector) { 
               //Saving the variables in a vector code piece
         }
         void execute() {
               myFuncPtr(vectorValues);
         }

     private:
        std::function<void(templated array of value types) myFuncPtr;
        std::vector<wrapper for templated values> vectorValues;
};


//Example of wanted use:
void main() {

    int counter = 0;
    std::string name("Some name...");
    std::function<int(void)> funcPtr(some function...);
    ITask task<int,std::string, std::function<int(void)>>(counter, name, funcPtr);
    task.execute();

}

有没有办法实现这个逻辑?

感谢提醒:)

1 个答案:

答案 0 :(得分:0)

很难从您的问题中说出来,但看起来您希望将参数提前绑定到通用Task对象中。

你可以使用std::bind(),它会给你一个类型擦除std::function对象,你的参数绑定或使用捕获lambda,即

#include <iostream>
#include <functional>

void someFunc(const std::string& name, int value)
{
   std::cout << name << " " << value << std::endl;  
}

int main() {

  int count =0;
  std::string name("Some name...");


  std::function<void()> task = std::bind(&someFunc,name,count );

  //alternative without bind is to wrap it in a capturing lambda
  std::function<void()> task2 = [=](){ someFunc(name,count); };

  task();
  task2();
  return 0;
}

Demo

或者,如果你想使用你的示例Task类,这样的东西可以工作......

#include <iostream>
#include <functional>

class Task {

     public:
         template <typename Func, typename... Args>
         Task(Func&& f,Args&&... args) :
            func_([=]()
             { f(args...); })
        {}

        void execute() 
        {
            func_();
        }

     private:
        std::function<void()> func_;

};

void someFunc(const std::string& name,int count)
{
   std::cout << name << " " << count;

}
//Example of wanted use:
int main() {

    int counter = 0;
    std::string name("Some name...");

    Task task(&someFunc,name,counter);
    task.execute();

    return 0;
}

Demo