C 11和类构造函数中的variadic模板

Variadic templates in C++ 11 and class constructors

本文关键字:variadic 模板 构造函数      更新时间:2023-10-16

我是新手使用C 模板的新手,并且遇到了variadic模板,并且想知道是否有适合我的需求。

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

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。我想避免在我可能尚不清楚的所有不同情况下复制构造函数 - variadic模板是解决方案吗?

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

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

,但我不知道如何表达XS与All X1 ... Xn之间的关系,因此,从本质上讲,当我像现在一样构造我的班级时:

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

即使我通过x3,x4等,这也将继续工作

不确定是否可能。

您不能拥有差异数的字段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... )
{
}