Funzione C ++ (de) duplicazione in classi templatizzate

2

Dai un'occhiata a questo snippet di codice:

template<int N> class Foo {
public:
    int f() { return N; }
    int g() { return 0; }
};

Foo<3> a;
Foo<4> b;

Penso che sia dipendente dal compilatore, ma, in generale, verranno generate due diverse istanze di g() per a e per b o il compilatore riconoscerà che non dipende dai parametri del modello e genera solo un'istanza?

    
posta Toni Homedes i Saun 02.09.2016 - 11:32
fonte

2 risposte

2

Non penso che tu possa dipendere da ciò che accade con i compilatori attuali.

Piuttosto che g_aux() suggerito nei commenti, potresti prendere in considerazione l'utilizzo dell'ereditarietà:

class base { 
public:
    int g() { return 0; }
};

template <int N>
class Foo : public base {
public:
    int f() { return N; }
};

Con questo è ancora possibile che il compilatore possa generare il codice inline per g se è abbastanza semplice, ma sulla base dei tuoi commenti dubito che sia davvero una preoccupazione. Senza inlining ... beh, g() è un membro di una classe, quindi possiamo aspettarci che ogni compilatore ne generi esattamente una copia.

Poiché questo non è inteso per consentire la conversione alla classe base, il modo teoricamente corretto per farlo sarebbe probabilmente quello di rendere g() una funzione membro protetta, utilizzare l'ereditarietà privata e aggiungere using base::g; alla classe derivata per rendere g() (e solo g, non la classe base stessa) visibile al mondo esterno:

#include <iostream>

class base {
protected:
    int g() { return 0; }
};

template <int N>
class Foo : private base {
public:
    using base::g;
    int f() { return N; }
};

int main() {
    Foo<3> a;
    Foo<4> b;

    std::cout << a.g() << "\n" << b.g() << "\n"; // <-- no problem

    // base *c = &a; // <-- fails
}
    
risposta data 11.09.2016 - 02:06
fonte
1

Ho appena provato con g ++

/* prova.cpp */
template<int N> class Foo {
public:
    int f() { return N; }
    int g() { return 0; }
};

int bar() {
    Foo<3> a;
    Foo<4> b;

    return a.g() + b.g(); /* Required to force the compiler to generate the functions */
}

funzione:

g++ -c prova.cpp && objdump -sS prova.o

e in effetti genera due diverse funzioni g() con contenuti identici.

    
risposta data 02.09.2016 - 12:01
fonte

Leggi altre domande sui tag