将emplace_back添加到模板类

Add emplace_back to template class

本文关键字:添加 emplace back      更新时间:2023-10-16

我遇到了实现自己的模板类的问题,我想添加我自己的emplace_back函数实现。由于我还在学习模板设计,我将感谢您在这里的投入。

template <typename T, typename ...Args>
class MydataStruct
{
public:
    //...
    void emplace_back(Args&&... args)
    {
        //...
        myqueue.emplace_back(args...);
    }
    //...
private:
    std::deque<T> myqueue;
};

样品使用:

MydataStruct<int> test;
test.emplace_back(1);

每当我尝试编译此代码时,我都会收到未定义emplace_back的错误。它只能在没有参数的情况下工作。我应该如何解决这个问题?

应使成员函数成为成员函数模板。使用可变参数转发引用捕获参数,然后std::forward参数以myqueue.emplace_back

template <typename T>
class MydataStruct
{
public:
    //...
    template<typename ...Args>
    void emplace_back(Args&&... args)
    {
        //...
        myqueue.emplace_back(std::forward<Args>(args)...);
    }
    //...
private:
    std::deque<T> myqueue;
};

错误在于您将可变参数模板放在类的模板参数中,而不是将可变参数模板添加到方法中。试试这个。

#include <deque>
template <typename T /*typename ...Args*/>
//        remove this ^^^^^^^^^^^^^^^^^
class MydataStruct
{
public:
    //...
    template<typename ...Args>
    // add this ^^^^^^^^^^^^^
    void emplace_back(Args&&... args)
    {
        myqueue.emplace_back(args...);
    }
private:
    std::deque<T> myqueue;
};
int bop()
{
    MydataStruct<int> test;
    test.emplace_back(1);
}

编辑:请注意,这不会对右值执行您想要的操作。您将需要使用 std::forward。

要让你的例子工作,你必须做

MydataStruct<int,int> test;
test.emplace_back(1);

但是移动...参数到emplace_back函数是要走的路...