从可变参数模板构造类

Tho*_*man 4 c++ templates variadic-templates

我正在尝试创建一个名为class的类Sink,它将创建一个指向您传入的类的指针,这是在RAII中包装api.

在此代码的完整版本中,自定义类也从另一个类继承,并且有静态资产来检查它.指针也传递给api.

但为了保持简单,我删除了这个.

这是我从cpp.sh得到的错误

 In function 'int main()':
43:30: error: no matching function for call to 'Sink<OneArg>::Sink(int)'
43:30: note: candidate is:
10:5: note: Sink<CustomSink, Args>::Sink(Args&& ...) [with CustomSink = OneArg; Args = {}]
10:5: note:   candidate expects 0 arguments, 1 provided
Run Code Online (Sandbox Code Playgroud)

码:

#include <string>
#include <iostream>
#include <memory>
#include <utility>

template<typename CustomSink, typename... Args>
class Sink
{
public:
    Sink(Args&&... args)
    {        
       _ptr = std::make_unique<CustomSink>(std::forward<Args>(args)...);        
    }
    ~Sink() 
    {
    }
private:
    std::unique_ptr<CustomSink> _ptr;
};


//////////////////////////////////////////////////////////////////////
class NoArg
{
public:
    NoArg() {};
    ~NoArg() {};
};

class OneArg
{
public:
    OneArg(int a) {
        std::cout << a << '\n';
    };
    ~OneArg() {};
};
//////////////////////////////////////////////////////////////////////


int main(){
    Sink<NoArg> noArgSink;   
    Sink<OneArg> oneArgSink(5);  

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 5

应该将构造函数的模板参数从类移动到模板化构造函数:

template<typename CustomSink>
class Sink
{
public:
    template <typename... Args>
    Sink(Args&&... args)
    {        
       _ptr = std::make_unique<CustomSink>(std::forward<Args>(args)...);        
    }
private:
    std::unique_ptr<CustomSink> _ptr;
};
Run Code Online (Sandbox Code Playgroud)


Nat*_*ica 5

您的问题在于模板类型的位置Args.现在你Args在班上有时间

Sink<OneArg> oneArgSink(5);
Run Code Online (Sandbox Code Playgroud)

Args是空的所以Sinks构造函数不期望任何参数.您需要做的是Args通过使其成为模板来移动到构造函数.那给了你

template<typename... Args>
Sink(Args&&... args)
{        
   _ptr = std::make_unique<CustomSink>(std::forward<Args>(args)...);        
}
Run Code Online (Sandbox Code Playgroud)

现在,构造函数将推导传递给它的参数,而不必在声明类时指定它.