C'è qualche alternativa ai puntatori di funzione in c ++?

5

Sono un programmatore c ++ novizio che ha mantenuto l'idea che i puntatori di funzione sono una cosa di C e OOP in C ++ non ne consiglia l'utilizzo.

So che quello che scrivo qui è vago / ampio. Ma sarebbe bello se qualcuno potesse commentare se la mia idea è completamente sbagliata o qualcosa di sensato.

Grazie.

    
posta NeonGlow 07.10.2013 - 13:50
fonte

3 risposte

17

Non penso che ci sia un consiglio ampiamente accettato per evitare i puntatori di funzione, tuttavia ci sono alcune alternative.

Metodi virtuali Uno degli usi più comuni dei puntatori di funzione in C è l'implementazione di dispatch dinamico. In C ++ tuttavia questo può essere fatto per te (per la singola spedizione) usando le funzioni virtuali, in effetti la solita implementazione è che il compilatore crea essenzialmente un tabella dei puntatori di funzione .

Functors

nel senso C ++, un functor è una piccola classe di utilità che sovraccarica operator () di comportarsi come una funzione di prima classe, dato che è una classe normale è possibile passare i propri oggetti come qualsiasi altro oggetto senza bisogno di puntatori di funzione. / p>

Lambdas

essenzialmente fornisce un modo più conveniente per dichiarare i funtori in linea.

Modelli

Fornire un modo generico per utilizzare / consumare i puntatori di funzioni, i funtori o i lambda. Quindi puoi scrivere funzioni di ordine superiore senza bisogno di puntatori di funzione, utilizzando un parametro std::function o direttamente utilizzando un parametro template.

    
risposta data 07.10.2013 - 14:23
fonte
3

Ecco un esempio in cui l'uso del puntatore di funzione membro - all'interno di una classe, come dettaglio di implementazione - è perfettamente accettabile, se si lavora con codice sensibile alle prestazioni per diverse architetture della CPU.

Consulta le Domande frequenti su C ++ per l'uso corretto del puntatore a funzioni dei membri. Richiede una sintassi diversa rispetto ai puntatori di funzioni statiche.

(Grazie per Kaz per il suggerimento.)

class SomePerformanceCriticalOperation
{
private:
    // the type declaration of a member function pointer

    typedef int (SomePerformanceCriticalOperation::*ProcessPtr)(size_t bytesToProcess, void* dataPtr);

    // the instance of a member function pointer, to be assigned to a member function
    // (inside the constructor)
    ProcessPtr m_ptr;

public:
    SomePerformanceCriticalOperation()
    {
        cpu_features feat = ::GetCpuFeatures();
        if (TestBit(feat, cpu_features_SSE41))
            m_ptr = &SomePerformanceCriticalOperation::Process_SSE41;
        else if (TestBit(feat, cpu_features_SSSE3))
            m_ptr = &SomePerformanceCriticalOperation::Process_SSSE3;
        else if (TestBit(feat, cpu_features_SSE3))
            m_ptr = &SomePerformanceCriticalOperation::Process_SSE3;
        else if (TestBit(feat, cpu_features_SSE2))
            m_ptr = &SomePerformanceCriticalOperation::Process_SSE2;
        else if (TestBit(feat, cpu_features_MMX))
            m_ptr = &SomePerformanceCriticalOperation::Process_MMX;
        else 
            m_ptr = &SomePerformanceCriticalOperation::Process_CPlusPlus;
    }

    // The CPU-specific functions, as usual. (Omitted.)

    int Process_SSE41(size_t bytesToProcess, void* dataPtr) { ... }
};
    
risposta data 08.10.2013 - 06:14
fonte
1

Certamente i programmatori C usavano molto i puntatori di funzioni, ma la maggior parte di questi usi è stata superata con le alternative OO, anche se potrebbero non essere ovvie senza esaminare il problema da risolvere piuttosto che la soluzione stessa. Ad esempio, erano popolari nell'implementazione di macchine a stati, ma un programmatore C ++ preferirebbe utilizzare un schema di fabbrica .

Un concetto per cui sono ancora necessari è l'implementazione di un delegato (forse l'unico motivo per usarne uno nel 21 ° secolo !?). Fornito come parte della lingua in altri posti, il povero sviluppatore c ++ deve ancora scrivere il proprio - ma è divertente da fare (no !?) e puoi trovare una descrizione di come farlo qui: Overflow dello stack

    
risposta data 21.10.2013 - 13:25
fonte

Leggi altre domande sui tag