Чтобы постараться не смущать себя и коллег - программистов с этой редко используемой функцией, можно всегда делать внутренние классы статичными.
В случае, если ссылка на внешний класс необходима, можно передать его явно в конструкторе.
Вы можете сделать это в текущем 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, но пропустите первый параметр. Так что все они скользят по одному месту. В конце концов, все они будут значениями по умолчанию, и сработает специализация, которая ничего не наследует, тем самым прервав рекурсию.
Обновление: просто было странное ощущение, что я раньше публиковал что-то подобное, и угадайте, что ...
Похоже, вы имеете в виду C ++ 0x Variadic Templates . Вы также можете добиться того же эффекта, используя конструкцию Александреску TypeList из Loki .
Я считаю, что рассматриваемый синтаксис вариативного шаблона будет выглядеть следующим образом.
template <typename...T>
class X : public T... {};
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 N
th 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
{
...
};
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.