2017-04-06 2 views
0

ist dieser Code formell ok? Weil ich nicht sicher, ob ich in der Kinderklasse Template-Funktion spezialisiert, wie in diesem Beispiel kann:Parent variadic Funktionsvorlage in Kind spezialisiert

main.cpp:

class Consumer 
{ 
public: 
    Consumer() = default; 
    ~Consumer() = default; 
    template<typename... T> 
    void echo(iConnector& connector, T... args) 
    { 
     connector.transfer(args...); 
    } 
}; 

int main(int argc, char** argv) { 
    Consumer c; 
    intConnector i; 
    stringConnector s; 
    c.echo(i, 1); 
    c.echo(i, std::string("aaa")); 
    c.echo(s, std::string("aaa")); 
    c.echo(s, 1); 
    return 0; 
} 

iConnector.h

class iConnector { 
public: 
    iConnector() = default; 
    virtual ~iConnector() = default; 
    template<typename... T> 
    void transfer(T... args) { std::cout << "Not defined\n"; } 
}; 

intConnector.h

class intConnector : public iConnector { 
public: 
    intConnector() = default; 
    virtual ~intConnector() = default; 
}; 

intConnector.cpp

template<> 
void iConnector::transfer<int>(int i) 
{ 
    std::cout << "intConnector " << i << "\n"; 
} 

stringConnector.h

class stringConnector : public iConnector { 
public: 
    stringConnector() = default; 
    virtual ~stringConnector() = default; 
} 

stringConnector.cpp

template<> 
void iConnector::transfer<std::string>(std::string str) 
{ 
    std::cout << "stringConnector " << str << "\n"; 
} 

Vielen Dank für Anregungen. Adrian

Antwort

1

Die kanonische Form einer variadische Template-Funktion verwendet rvalue Referenzen und std::forward:

template<typename... T> 
void echo(iConnector& connector, T&&... args) 
{ 
    connector.transfer(std::forward<T>(args)...); 
} 

Dies werden die Saiten nicht kopiert verhindern.

Sie brauchen keine Template-Funktion die variadische Form zu überlasten:

void iConnector::transfer(int i) 

Der Compiler wird diese Überlastung wählen, ob der Parameter ein int ist.

Ihre connector::transfer könnte besser sein als const beschrieben:

void iConnector::transfer(int i) const 

Dies trägt zu Ihrem Anschluss Bezug über:

void echo(iConnector const &connector, T&&... args) 
+0

Sie Antwort danken. –

+0

Ich habe vergessen zu erwähnen, dass dies auf http://codereview.stackexchange.com/ –

+0

veröffentlicht werden sollte Wenn Sie 'iConnector :: transfer (int i)' überladen, die aufgerufen werden, wenn Sie 'transfer (1L)' übergeben? – aschepler

Verwandte Themen