C ++ 11和类构造函数中的可变参数模板

时间:2019-05-08 16:55:30

标签: c++ templates variadic-templates

一般来说,我是刚接触C ++模板的人,偶然发现了可变参数模板,并且想知道是否可能适合我的需求。

我有此代码,并且工作正常:

template< typename T, typename X1, typename X2 >
class MyClass
{
    public :

    MyClass( std::shared_ptr< T > track ,
             std::shared_ptr< X1 > x1   ,
             std::shared_ptr< X2 > x2   ) ;
}

template< typename T, typename X1, typename X2 >
MyClass < T,X1,X2 >::MyClass( std::shared_ptr< T > track ,
                              std::shared_ptr< X1 > x1   ,
                              std::shared_ptr< X2 > x2   ) : d_track( track ) , d_x1( x1), d_x2( x2 )

但让我说我想让它更通用-意味着X1,X2可以是随机数-例如我可以有X3和X4。我想避免为我可能遇到的所有不同情况重复构造函数,因为到目前为止尚不知道-可变参数模板是否可以解决此问题?

在代码草案中,我的意思是:

template< typename T, typename... XS >
MyClass < T,???? >::MyClass( std::shared_ptr< T > track ,
                              std::shared_ptr< ?? > x1   ,
                              std::shared_ptr< ?? > x2   ,
                              .......) : 

但是我不知道如何表达XS与所有X1 ... XN之间的关系,因此实质上像我现在这样构造类时,

MyClass< T, X1, X2 > local(.....)

即使我通过X3,X4等,这也将继续起作用。

不确定是否可以。

1 个答案:

答案 0 :(得分:8)

字段d_x1,d_x2,...不能有可变的数量;但这可以通过使用std::tuple来解决:

#include <memory>
#include <tuple>

template< typename T, typename... XS >
class MyClass
{
    std::shared_ptr<T> d_track;
    std::tuple<std::shared_ptr<XS>...> d_xs;
public:

    MyClass( std::shared_ptr< T > track ,
             std::shared_ptr< XS >... xs ) ;
};

template< typename T, typename... XS >
MyClass< T, XS... >::MyClass( std::shared_ptr< T > track ,
                              std::shared_ptr< XS >... xs)
    : d_track( track ) , d_xs( xs... )
{
}