У меня есть класс, который должен зависеть по некоторым причинам от параметра шаблона int
.
По тем же причинам этот параметр не может быть частью списка параметров для класса, вместо этого он является частью списка параметров его конструктора (то есть, конечно, шаблонов).
Здесь возникли проблемы.
Может быть, я что-то упустил, но я не вижу простого способа предоставить такой параметр конструктору, потому что он не может быть выведен или явно указан.
До сих пор я нашел следующие альтернативы:
-
поместите указанный выше параметр в список параметров класса
-
создайте метод factory или factory, который можно вызвать в качестве примера как
factory<42>(params)
-
предоставляет конструкцию признаков конструктору
Я попытался создать (не такой) минимальный рабочий пример для последнего упомянутого решения, также для того, чтобы лучше объяснить проблему.
Класс в примере не является классом шаблона для себя, поскольку ключевым моментом является конструктор, в любом случае реальный - это шаблонный класс.
#include<iostream>
#include<array>
template<int N>
struct traits {
static constexpr int size = N;
};
class C final {
struct B {
virtual ~B() = default;
virtual void foo() = 0;
};
template<int N>
struct D: public B{
void foo() {
using namespace std;
cout << N << endl;
}
std::array<int, N> arr;
};
public:
template<typename T>
explicit C(T) {
b = new D<T::size>{};
}
~C() { delete b; }
void foo() { b->foo(); }
private:
B *b;
};
int main() {
C c{traits<3>{}};
c.foo();
}
Если честно, ни одно из вышеперечисленных решений не подходит хорошо:
-
перемещение параметра в список параметров класса полностью разрушает его конструкцию и не является жизнеспособным решением
-
a factory метод - это то, чего я бы хотел избежать, но он мог решить проблему
-
структура признаков кажется лучшим решением до сих пор, но почему-то я не полностью удовлетворен
Вопрос довольно прост: есть ли что-то, что я пропустил там, возможно, более легкое, более элегантное решение, деталь языка, который я полностью забыл, или три подхода, упомянутых выше тех, из которых я должен выбрать? < ш > Любое предложение будет оценено.