这目前是伪代码,因为这是我在开始将其编写为完整代码之前正在研究的一个想法。
我知道我可以创建一个普通的可变参数函数,它使用va_arg
and va_list
,printf()
但是,我想完全避免使用它们。
我正在考虑使用模板化可变参数。我正在考虑使用可变参数制作一个可实例化的类模板。这里的条件是这个类的构造函数只能接受两种类型,但任何一种类型的数量都可以变化。我知道与编译器将如何解释以及调用它们的顺序相比,参数在代码中的写入位置是不可知的,但这不是问题。我为参数选择的顺序是出于可读性和一致性目的的约定。
下面是一个伪代码示例:
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);
};
但是,这将迫使用户必须构造对象,然后调用这两个函数......我试图在构造时完成所有这些......