В шаблонах, которые я изучал, у нас могут быть только интегральные аргументы, то есть int, указатель на другие типы данных, а также параметр шаблона шаблона.
Но здесь я могу передать только простой класс в качестве аргумента шаблона. Это верно, или то, что я понимаю, неправильно. Вот кусок кода.
template <typename T>
class A {
public:
T t;
};
class B {
public:
float f;
};
template <template<typename> class X, class H>
class C {
public:
H obj;
X<int> x;
};
int main()
{
C < A, B > my;
my.obj.f = 2.3f;
my.x.t = 5;
cout << "template class object: " << my.obj.f << endl;
cout << "class object : " << my.x.t << endl;
}
Существует три типа параметров шаблона:
int
, std::string
, так далее.). В вашем примере H
является параметром типа;42
). Ваш пример не содержит ни одного из них;A
это параметр шаблона.В шаблонах, которые я изучал, у нас могут быть только интегральные аргументы, то есть int, указатель на другие типы данных, а также параметр шаблона шаблона.
То, на что вы ссылаетесь в первой части вышеприведенного предложения, относится ко второй категории параметров, то есть к нетиповым параметрам, а последняя часть предложения охватывает параметры шаблона шаблона.
Действительно, нетипичный параметр требует значений определенного типа, например, int
, X*
передаваться в качестве аргументов при создании экземпляра шаблона, и существуют серьезные ограничения на:
Например, это запрещено:
template<double D>
struct X { /* ... */ };
Пока это разрешено:
template<int* P>
struct X { /* ... */ };
Но накладываются ограничения на то, что может быть предоставлено в качестве аргумента для P
:
int main()
{
int x = 42;
X<&x> obj; // ERROR!
}
Часть, которую ваше предложение выше не охватывает, является первой категорией (параметры типа), и именно она чаще всего встречается. Среди прочего, параметры типа используются для создания общих коллекций объектов, таких как:
std::vector<my_class> v;
Других решений пока нет …