У меня есть шаблон A
с параметром, отличным от типа:
template <int param = 0>
class A
{
public:
static constexpr void print()
{
std::cout << param << std::endl;
}
};
И у меня есть класс B
, в конструкторе которого я собираюсь использовать шаблон A
.
class B
{
public:
B()
{
A<> a{};
}
};
Для инициализации a
я хочу использовать constexpr int
из основной функции.
int main()
{
constexpr int val = 123;
B b{};
}
В случае общей функции я мог бы просто превратить ее в шаблон, но, насколько я знаю, для конструкторов это не работает. По крайней мере, у меня это не сработало.
Делать весь класс B
в шаблоне — это не вариант, мне нужно, чтобы он оставался классом.
Можно ли передать val
из основного конструктора B
класса?
cout
не является константным выражением
Да неужели. Я исправлю это.
Я знаю, что cout
не является константным выражением, оно используется просто для примера.
Проблема в том, что вам нужно передать переменную consexpr из main, что возможно только с использованием шаблонов (не считая макроса). Итак, выбор B
должен быть очевидным выбором, который, как вы сказали, невозможен.
Учитывая ограничения, я считаю, что ответ «нет».
@Evg Я понимаю, что в случае из примера, если я уйду A<>
, это будет преобразовано в A<0>
. В моем примере шаблон оставлен без параметров, потому что я хотел, чтобы пример можно было компилировать. Кроме того, a
не является членом класса, и мне это не нужно.
@user12002570 user12002570 В реальном проекте класс B большой, поэтому превратить его в шаблон будет проблемой.
Вы можете использовать std::integral_constant для передачи этой константы:
class B
{
public:
template <int N>
explicit B(std::integral_constant<int, N>)
{
A<N> a{};
}
};
int main()
{
constexpr int val = 123;
B b{std::integral_constant<int, val>{}};
}
Это сработало! Большое спасибо.
Вы должны предоставить конструктор constexpr для
B
, который передает свой параметр вA
.