Usar ponteiros de função para fazer referência a em operadores como o operador "maior que" (">") em uma classe de modelo, é necessário especificar as sobrecargas de tipo corretas. No entanto, isso pode ser desafiador.
Os operadores integrados C, como os operadores aritméticos e lógicos, não são funções reais de operadores. Em vez disso, eles são traduzidos diretamente em instruções assembly pelo compilador. Portanto, não é possível obter ponteiros de função para eles.
Os objetos de função, definidos no padrão C, fornecem uma maneira de trabalhar com operações que se comportam como ponteiros de função mas não são funções reais. Eles são objetos modelados que decaem para o operador análogo em sua função operator().
Por exemplo, o objeto de função std::greater representa o operador maior que (">"). Ele pode ser usado como um argumento de ponteiro de função em uma classe de modelo.
template
class MyAction
{
public:
MyAction(ParamsType& arg0, ParamsType& arg1, FnCompareType& fnCpmpare)
: arg0_(arg0), arg1_(arg1), fnCompare_(fnCompare_) {}
bool operator()()
{
if((fnCompare_)(arg0_,arg1_))
{
// Do this
}
else
{
// Do s.th. else
}
}
private:
ParamsType& arg0_;
ParamsType& arg1_;
FnCompareType& fnCompare_;
}
void doConditional(int param1, int param2)
{
MyAction> action(param1, param2);
if(action())
{
// Do this
}
else
{
// Do that
}
}
Embora os ponteiros de função não possam ser usados diretamente com operadores integrados, eles podem ser usados com operadores de biblioteca padrão que são implementados como funções reais. No entanto, é necessário instanciar a instância específica da classe de modelo para o operador, e o compilador pode exigir dicas para deduzir corretamente o argumento do modelo.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3