[英]Parent variadic function template specialized in child
is this code formally ok? 这段代码正式可以吗? Because I not sure if I may specialized template function in child class as in this example:
因为我不确定是否可以像下面的示例中那样专门在子类中使用模板函数:
main.cpp: 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 iConnector.h
class iConnector {
public:
iConnector() = default;
virtual ~iConnector() = default;
template<typename... T>
void transfer(T... args) { std::cout << "Not defined\n"; }
};
intConnector.h intConnector.h
class intConnector : public iConnector {
public:
intConnector() = default;
virtual ~intConnector() = default;
};
intConnector.cpp intConnector.cpp
template<>
void iConnector::transfer<int>(int i)
{
std::cout << "intConnector " << i << "\n";
}
stringConnector.h stringConnector.h
class stringConnector : public iConnector {
public:
stringConnector() = default;
virtual ~stringConnector() = default;
}
stringConnector.cpp stringConnector.cpp
template<>
void iConnector::transfer<std::string>(std::string str)
{
std::cout << "stringConnector " << str << "\n";
}
Thank you for suggestions. 谢谢你的建议。 Adrian
阿德里安
The canonical form of a variadic template function uses rvalue references and std::forward
: 可变参数模板函数的规范形式使用右值引用和
std::forward
:
template<typename... T>
void echo(iConnector& connector, T&&... args)
{
connector.transfer(std::forward<T>(args)...);
}
This will prevent your strings from being copied. 这样可以防止您的字符串被复制。
You don't need a template function to overload the variadic form: 您不需要模板函数来重载可变格式:
void iConnector::transfer(int i)
The compiler will choose this overload if the parameter is an int
. 如果参数为
int
则编译器将选择此重载。
Your connector::transfer
might be better described as const
: 您的
connector::transfer
可能更好地描述为const
:
void iConnector::transfer(int i) const
This carries over to your connector reference: 这会延续到您的连接器参考中:
void echo(iConnector const &connector, T&&... args)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.