我希望设计一个类型安全的NxM 交叉连接。这是一种允许N个功能输出中的任何一个连接到M个输入中的任何一个的机制。或者换句话说,将函数(来自一组函数)的返回值与另一个函数的参数连接起来。一个关键方面是这些连接必须在运行时可配置。我遇到的主要问题是输入的类型将根据每个连接而与输出不同。
让我们在程序中的某个任意点说我想将float foo()
的返回值与val
中的参数void bar(double val)
相关联。
我目前有两个参数化类,代表输入和输出,名为Source<T>
和Dest<U>
。 T&amp; U应该是float,double,bool,int,unsigned int等。我有一个异构的Source<T>
实例集合,有些是double,有些是float,有些是int,有些是bool。还有一个异构的Dest<U>
实例集合,也有一些double,一些float,一些int,一些bool。有时T和U是相同的类型。对于更多上下文,这些实例都与唯一名称相关联,允许更高级别的系统说&#34;现在请将source :: foo与dest :: bar&#34;连接,或者&#34;删除源之间的关联:: red和dest :: blue&#34;。
在前面的示例中,在编译时,程序员将foo()
的返回值类型称为float,并且可以在source中指定,因此可以实例化Source<float>
并且与此功能相关联。并且bar()
的参数类型也已知为double,因此Dest<double>
可以实例化并与此函数关联(使用std::function
包装器)。然后在运行时 Source<float>
可以与Dest<double>
关联,并通过多态指针(通过所有{{1}的继承接口)将值传递给Dest<double>
实例共享)。然后,Dest<U>
将使用Dest<double>
包装器调用函数bar()
。
因此,在运行时,目标是将任何std::function
与任意Source
关联,任意持续时间,并随时重新关联。因此,我需要一种方法来创建一个函数,该函数可以将仅在运行时已知的类型Dest
转换为另一种类型T
,该类型仅在运行时已知。
为了使事情稍微复杂化,返回值和参数值实际上可能是任意大小的数组。例如,U
可能会返回foo()
数组,但float[32]
可能需要bar()
数组(可能会丢掉每4个值中的3个)。我的想法是这个&#34; Bridge&#34;一旦它可以处理类型转换,机制就会处理它。
double[8]
函数来进行转换,但因为这一切都需要在运行时发生,所以我不认为& #39;是答案。
编写泛型Bridge<T,U>
函数是否是最佳方法,然后创建某种动态调度机制,以便在运行时根据T和U选择合适的函数?我如何在运行时确定T和U的类型以选择Bridge<T,U>
的正确实例?我还想了解T和U是同一类型的情况,因此避免任何不必要的转换(作为优化)。
还是有更好的方法来完成我想做的事情吗?