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;
}