简体   繁体   English

专门针对孩子的父母可变参数功能模板

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM