Шаблоны Variadic в C ++ 11 и конструкторы классов - PullRequest
3 голосов
/ 08 мая 2019

Я новичок в использовании шаблонов 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 Ответ

8 голосов
/ 08 мая 2019

Вы не можете иметь переменное число полей 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... )
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...