Это в настоящее время псевдокод, так как это идея, над которой я работаю, прежде чем я начну писать ее как полный код.
Я знаю, что могу создать обычную функцию variadi c, которая использует va_arg
и va_list
, такие как printf()
, однако я хочу избегать их полного использования.
Я думал об использовании вместо этого шаблонных переменных c. Я думал о создании инстанцируемого класса с использованием параметров variadi c. Условие здесь состоит в том, что конструктор этого класса может принимать только два типа, но число каждого типа может варьироваться. Я знаю, что параметры c записаны в коде по сравнению с тем, как компилятор будет интерпретировать и в каком порядке они вызываются, но это не проблема. Порядок, который я выбрал для параметров, условно для удобства чтения и согласованности.
Вот пример псевдокода:
class TypeIn {...}
class TypeOut{...}
template<typename... T1, typename... T2>
class MyObject {
std::array<TypeIn*> inputs_;
std::array<TypeOut*> outputs_;
public:
MyObject(T1&&... inputs, T2&& ... outputs) { ... }
};
Поскольку я все еще работаю в C ++ 17, и пока нет C ++ 20 с концепциями, модулями и сопрограммами, что было бы самым чистым и надежным и эффективным способом убедиться, что T1
является TypeIn
, а T2
является TypeOut
Класс объекта и для заполнения массивов соответственно? Я мог бы использовать вектор, но как только объект будет сконструирован, размеры входов и выходов не изменятся.
Возможный вариант использования:
using In = TypeIn;
using Out = TypeOut;
MyObject obj( In a, In b, In c, Out x, Out y);
И я бы предпочел не чтобы иметь это для синтаксиса, если это вообще возможно:
MyObject<In,In,In,Out,Out> obj( In a, In b, In c, Out X, Out y);
Так как первый более чистый или более читаемый.
Редактировать
Подумав, я подумал, а может ли это работать вместо этого ...
class In {...}
class Out{...}
// template<typename T1 = In, typename T2 = Out>
// T1 must == type In and T2 must == type Out
class MyObject {
private:
std::vector<In*> inputs_;
std::vector<Out*> outputs_;
public:
MyObject() = deafault;
template<typename... Inputs> // would probably use move semantics or forwarding
void assignInputs(Inputs&& ... inputs);
template<typename... Outputs> // would probably use move semantics or forwarding
void assignOutputs(Inputs&& ... outputs);
};
Однако это заставит пользователя создать объект, а затем вызвать обе функции ... Я был пытаясь сделать все это при строительстве ...