【问题标题】:Variadic templates in C++ 11 and class constructorsC++ 11 中的可变参数模板和类构造函数
【发布时间】:2019-05-09 01:05:57
【问题描述】:

一般来说,我是使用 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 等。

不确定这是否可能。

【问题讨论】:

  • 什么是 XS?它与 X1...XN 有什么关系?
  • @MaxLanghof 可能没有 - 我想要的是避免添加一个带有 x1、x2、x3 的模板构造函数 - 另一个带有 x1、x2、x3、x4 等的模板构造函数

标签: c++ templates variadic-templates


【解决方案1】:

你不能有可变数量的字段 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... )
{
}

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2016-01-02
    • 2018-05-18
    • 2016-09-02
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多