C ++ - 如何在仅在运行时知道的类型之间进行转换

时间:2013-03-25 02:15:39

标签: c++ types type-conversion

我希望设计一个类型安全的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;一旦它可以处理类型转换,机制就会处理它。

坦率地说,我并没有真正看到如何实现这一点。如果在编译时修复了Source-to-Dest关联,我可以编写一系列模板double[8]函数来进行转换,但因为这一切都需要在运行时发生,所以我不认为& #39;是答案。

编写泛型Bridge<T,U>函数是否是最佳方法,然后创建某种动态调度机制,以便在运行时根据T和U选择合适的函数?我如何在运行时确定T和U的类型以选择Bridge<T,U>的正确实例?我还想了解T和U是同一类型的情况,因此避免任何不必要的转换(作为优化)。

还是有更好的方法来完成我想做的事情吗?

0 个答案:

没有答案