Ir para conteúdo
Fórum Script Brasil
  • 0

implementação de classe para executar várias funções em lote


Kleber Oliveira

Pergunta

Estou tentando implementar para um projeto uma classe que guarda um vetor de ponteiros para funções, e executa essas funções de uma vez quando um método da classe é invocado. Essas funções podem ter 1 ou mais argumentos, mas no momento a classe só funciona quando eu uso funções que tenham apenas 1 argumento.

A implementação da classe que eu tenho no momento seria essa:

 

template<typename T, typename ... Args>
class Function {
private:
  std::vector<std::function<T(T, Args...)>> terms;
public:
  Function(std::initializer_list<std::function<T(T, Args...)>> array) {
    for(long unsigned int i=0; i<array.size(); i++) terms.push_back(std::data(array)[i]);
  }

  T operator()(T t, Args ... args) {
    T result = 0;
    for(long unsigned int i=0; i<terms.size(); i++) result += terms[i](t, args...);
    return result;
  }

  Function<T>& operator=(std::initializer_list<std::function<T(T, Args...)>> array) {
    for(long unsigned int i=0; i<array.size(); i++) terms.push_back(std::data(array)[i]);
    return *this;
  }
};

typedef Function<int> f_int;
typedef Function<float> f_float;
typedef Function<double> f_double;

 

Um código de teste para essa classe seria esse:

int p1(int x) {
  return x*x;
}

int p2(int x) {
  return x;
}

int p3(int x) {
  return 2;
}

int p4(int x, int y) {
  return x*x * 2*y*y;
}

int p5(int x, int y) {
  return 2*x*x + y*y;
}

float p6(float x) {
  return  x*x;
}

float p7(float x) {
  return  1.5f;
}

double p8(double x) {
  return x*x*x;
}

double p9(double x) {
  return -1.565*x*x;
}

double p10(double x) {
  return 17.515;
}

int main(int argc, char ** argv) {
  //std::function f_1(p4), f_2(p5);
  //std::cout << f_1(3,2) << std::endl;
  //std::cout << f_2(3,2) << std::endl;

  f_int f1 = f_int {p1, p2, p3};
  f_float f2 = f_float {p6, p7};
  f_double f3 = f_double {p8, p9, p10};
  std::cout << f1(-2) << std::endl;
  std::cout << f2(3.5f) << std::endl;
  std::cout << f3(-2.185) << std::endl;
  return 0;
}

Alguém conseguiria dar uma dica de como alterar a classe para que ela funcione com funções de mais de 1 argumento? Por exemplo, com as funções p4 e p5 do exemplo.

Editado por Kleber Oliveira
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...