Передача класса как нетипичного аргумента в шаблонах в переполнении стека

В шаблонах, которые я изучал, у нас могут быть только интегральные аргументы, то есть 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;
}

1

Решение

Существует три типа параметров шаблона:

  • Введите параметры, для которых тип должен быть представлен в качестве аргумента (например, 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;
2

Другие решения

Других решений пока нет …