Как передать constexpr в конструктор?

У меня есть шаблон 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 класса?

Вы должны предоставить конструктор constexpr для B, который передает свой параметр в A.

AndyG 27.06.2024 15:31
cout не является константным выражением
Daniel A. White 27.06.2024 15:40

Да неужели. Я исправлю это.

ShellfisH 27.06.2024 15:40

Я знаю, что cout не является константным выражением, оно используется просто для примера.

ShellfisH 27.06.2024 15:51

Проблема в том, что вам нужно передать переменную consexpr из main, что возможно только с использованием шаблонов (не считая макроса). Итак, выбор B должен быть очевидным выбором, который, как вы сказали, невозможен.

user12002570 27.06.2024 16:00

Учитывая ограничения, я считаю, что ответ «нет».

KamilCuk 27.06.2024 16:07

@Evg Я понимаю, что в случае из примера, если я уйду A<>, это будет преобразовано в A<0>. В моем примере шаблон оставлен без параметров, потому что я хотел, чтобы пример можно было компилировать. Кроме того, a не является членом класса, и мне это не нужно.

ShellfisH 27.06.2024 16:18

@user12002570 user12002570 В реальном проекте класс B большой, поэтому превратить его в шаблон будет проблемой.

ShellfisH 27.06.2024 16:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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>{}};
}

Демо

Это сработало! Большое спасибо.

ShellfisH 27.06.2024 16:34

Другие вопросы по теме

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