Список аргументов шаблона переменной длины?

Чтобы постараться не смущать себя и коллег - программистов с этой редко используемой функцией, можно всегда делать внутренние классы статичными.

В случае, если ссылка на внешний класс необходима, можно передать его явно в конструкторе.

10
задан Phil Miller 2 October 2009 в 20:37
поделиться

4 ответа

Вы можете сделать это в текущем C ++. Вы задаете шаблону «достаточно большое» количество параметров и задаете им значения по умолчанию:

class nothing1 {};
class nothing2 {};
class nothing3 {};

template <class T1 = nothing1, class T2 = nothing2, class T3 = nothing3>
class X : public T1, public T2, public T3 {};

Или вы можете усложнить и использовать рекурсию. Сначала вы объявляете шаблон:

class nothing {};

template <class T1 = nothing, class T2 = nothing, class T3 = nothing>
class X;

Затем вы специализируетесь на случае, когда все параметры заданы по умолчанию:

template <>
class X<nothing, nothing, nothing> {};

Затем вы правильно определяете общий шаблон (который ранее вы ve только с прямым объявлением):

template <class T1, class T2, class T3>
class X : public T1, public X<T2, T3>

Обратите внимание, как в базовом классе вы наследуете X, но пропустите первый параметр. Так что все они скользят по одному месту. В конце концов, все они будут значениями по умолчанию, и сработает специализация, которая ничего не наследует, тем самым прервав рекурсию.

Обновление: просто было странное ощущение, что я раньше публиковал что-то подобное, и угадайте, что ...

23
ответ дан 3 December 2019 в 13:27
поделиться

Похоже, вы имеете в виду C ++ 0x Variadic Templates . Вы также можете добиться того же эффекта, используя конструкцию Александреску TypeList из Loki .

Я считаю, что рассматриваемый синтаксис вариативного шаблона будет выглядеть следующим образом.

template <typename...T>
class X : public T... {};
19
ответ дан 3 December 2019 в 13:27
поделиться

As others already answered, variadic templates are part of the next standard, but can be emulated in current C++. One convenient tool for this is to use the Boost.MPL library. In your code, you write a single template parameter (let's name it "Typelist"), and the users of your template wrap the typelist in an MPL sequence. Example:

#include "YourType.h"
#include "FooBarAndBaz.h"
#include <boost/mpl/vector.hpp>

YourType<boost::mpl::vector<Foo, Bar, Baz> > FooBarBaz;

In the implementation of "YourType", you can access the elements in Typelist with various metafunctions. For example, at_c is the Nth element of the list. As another example, the "X" class in your question could be written with inherit_linearly as:

//Warning: Untested
namespace bmpl = boost::mpl;
template<class Typelist>
class X : bmpl::inherit_linearly<Typelist, bmpl::inherit<bmpl::_1, bmpl::_2> >::type
{
...
};
4
ответ дан 3 December 2019 в 13:27
поделиться

Variable number of templates is part of the next C++ standard. However, you can get a taste of it if you're using GCC (from version 4.3). Here's a list of available C++0x features in GCC. You're looking for Variadic Templates.

By the way, if you need a formal reference on how to achieve the inheritance mechanism as described by Earwicker, it's on the book C++ Templates.

2
ответ дан 3 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: