C ++ Передача значения конструктора шаблона в параметре шаблона - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь передать класс в качестве параметра шаблона. Но у этого класса есть только один обязательный конструктор, в который мы должны передать целочисленное значение. Поэтому я пытаюсь найти способ инициализации параметра конструктора шаблона.

#include <iostream>

template <class F>
class Class1 {
public:
    int i = 0;
    F f;
    Class1() { i = f.u; }
};

class Class2 {
public:
    int u = 5;
    Class2(int j) { u = j; }
};

int main() {
    Class1 <Class2>c;
    std::cout << c.i << std::endl;
}

Конечно, это дает мне ошибку «Class2, соответствующий конструктор по умолчанию недоступен». Сказав, что я хочу передать разные классы с конструкторами, которые не имеют одинакового количества параметров в шаблоне Class1, есть ли способ инициализировать конструктор шаблона? Я ищу что-то вроде Class1 c;

1 Ответ

1 голос
/ 10 апреля 2020

Class1 c; будет невозможно в качестве общего решения. Если разные F s будут иметь разные конструкторы, вам нужно указать, что передавать этому конструктору где-либо.

Один из способов, который представляется целесообразным, - это пересылать аргументы из конструктора Class1 в F.

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

#include <iostream>

template <class F>
class Class1 {
public:
    int i = 0;
    F f;
    template <typename... Args>
    Class1(Args&&... args) : f(std::forward<Args>(args)...) { i = f.u; }
};

class Class2 {
public:
    int u = 5;
    Class2(int j) { u = j; }
    Class2() = default;
};

int main() {
    Class1<Class2> c(10);
    Class1<Class2> c2;
    std::cout << c.i << " " << c2.i << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...