2017-04-06 30 views
0

这段代码正式确定吗?因为我不知道如果我可以专门模板函数在子类如本例:专门针对儿童的父母可变参数函数模板

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"; 
} 

谢谢你的建议。 阿德里安

回答

1

一个可变参数模板函数的规范形式使用右值引用和std::forward

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

这会防止你的字符串被复制。

你并不需要一个模板函数重载一个可变形式:如果参数是一个int

void iConnector::transfer(int i) 

编译器会选择这种过载。

connector::transfer可能会更好地描述为const

void iConnector::transfer(int i) const 

这延续到你的连接器参考:

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

感谢您的回答。 –

+0

我忘了提及这应该张贴在http://codereview.stackexchange.com/ –

+0

如果你重载'iConnector :: transfer(int i)',如果你通过'transfer(1L)'将被调用? – aschepler