Динамический размерный массив шаблонных параметров, передаваемых в функцию - PullRequest
0 голосов
/ 10 июня 2018

Я пытался найти способ, как создать функцию, которая может принимать переменные любого типа и их динамическое количество.

Причина этой функциональности в том, что я 'Я обертываю 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();

}

Есть ли какие-либоспособ реализовать эту логику?

Спасибо heads:)

1 Ответ

0 голосов
/ 10 июня 2018

Трудно сказать по вашему вопросу, но, похоже, вы хотите заранее связать аргументы в общий объект Task.

Вы можете просто использовать std::bind(), который вернет вам стертый тип std::function обратно с привязанными аргументами или использовать лямбду захвата, т. Е.

#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;
}

Демо

Или, если вы хотите использовать свой пример класса задач, что-то вроде этого будет работать ...

#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;
}

Демо

...