Pode o resultado de uma chamada de função ser usado como um valor de parâmetro padrão?

StackOverflow https://stackoverflow.com/questions/202718

  •  03-07-2019
  •  | 
  •  

Pergunta

Existe um método bom para escrever C / C ++ cabeçalhos de função com parâmetros predefinidos que são chamadas de função?

Eu tenho alguns cabeçalho com a função:

int foo(int x, int y = 0);

Eu estou trabalhando em uma grande base de código, onde muitas funções chamar essa função e dependem esse valor padrão. Esse valor padrão agora precisa mudar para algo dinâmico e eu estou procurando uma maneira de fazer:

int foo(int x, int y = bar());

Onde bar () é uma função que gera o valor padrão com base em alguns parâmetros do sistema. Alternativamente este protótipo função seria algo como:

int foo(int x, int y = baz.bar());

Onde Baz é uma função que pertence a um objeto que não foi instanciado dentro do arquivo de cabeçalho.

Foi útil?

Solução

Go figura! Ele faz o trabalho. argumentos padrão em funções C ++

Outras dicas

Gostaria de usar duas funções sobrecarregadas:

int foo(int x, int y);

int foo(int x){return foo(x,bar);}

Se você permitir que a função de encaminhamento para ser embutido, então a penalidade de desempenho é provável que pequenas para zero. Se você manter o corpo dela fora da linha em um arquivo não-header pode haver um custo de desempenho (provável que seja pequeno), mas muito mais flexibilidade na implementação e acoplamento reduzida.

Sim. O que você escreveu obras.

errada do que com a simples remoção do parâmetro opcional na primeira declaração e fornecendo uma única sobrecarga de parâmetro?

int foo(int x)
{
    Bar bar = //whatever initialization
    return foo(x,bar.baz());
}

int foo(int x,int y)
{
  //whatever the implementation is right now
}

Eu acho que isso tende a ser muito mais limpo e mais flexível do que tentar usar algum valor padrão dinâmico.

No padrão, seção 8.3.6 (argumentos padrão), parágrafo 5, eles dão um exemplo usando apenas esta abordagem. Especificamente, ele grita que os argumentos padrão são expressões , assim que uma chamada de função aplica-se, embora com restrições, tais como pesquisa de nome e compatibilidade tipo.

No meu local de trabalho, nós usamos assinaturas como esta:

void An_object::An_object(
  const Foo &a,
  const Bar &b,
  const Strategem &s = Default_strategem()
);

para permitir que clientes para substituir um comportamento em um construtor de classe. Ele veio a calhar para o comportamento condicional que o desempenho afetado de um tradutor ...

tangencial, mas isso parece-me que ele iria introduzir questões de dependência abaixo da estrada. Eu iria com o stbuton.myopenid.com abordagem.

Deve ser perfeitamente válido para chamar uma função global ou fazer referência a um objeto global neste contexto, enquanto a declaração da função / objeto está no escopo. Ele pode ou não ser aconselhável (em termos de bom design), mas deve funcionar.

Tente fazer bar () uma função de membro estático. Isso permitirá que qualquer parte do programa, que tem como classe estática uma em escopo para acessá-lo. Por exemplo:

Foo classe { público:

bar static int (); };

Então você teria que declarar:

int foo (int x, int Foo :: bar () y =);

Se você precisar de diferentes objetos, em seguida, passar na instância do objeto em seu lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top