C++模板:使用隐式转换到模板实例化类型来选择重载函数!
考虑这些重载函数,
void fun(Int2Type<1>) {}
void fun(Int2Type<2>) {}
void fun(Int2Type<3>) {}
void fun(Int2Type<4>) {}
我想以这种方式调用它们,
fun(1); // this should call first function
fun(4); // this should call fourth function
有没有办法做到这一点?如果是的话,我们可以对一些运行时值做同样的事情,这样说, (请注意,在上面的调用中,参数在编译时已知)
fun(value); // value can be decided at runtime!
或者如果不可能的话还有其他选择吗?目标是,根据不同的积分值调用不同的函数!
编辑
顺便说一下,我不能使用以下任何一个:
- 使用
switch(value)
- 使用一些
SomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2> ;()}
等
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以采取一些不同的做法:
然后您可以调用:
func<1>()
。或者您可以这样调用原始代码:
func(Int2Type<1>())
。无论如何,所有这些都仅适用于编译时常量。
You can do it a little differently:
And then you may call:
func<1>()
.Or you may call the original code this way:
func(Int2Type<1>())
.Anyway all of this only works with compile time constants.
不,无法使用运行时值作为模板参数。你唯一能做的就是:
No, there's no way to use runtime values as a template parameter. The only thing you can do is something like:
没有办法实现你想要的,因为它们都归结为同一件事——跳转表,或者一大堆 if/else。就是这样。任何其他功能都将变得如此。只需制作一个跳转表即可。您可以使用函数指针数组(最快)或更灵活的数组,例如
unordered_map>
。哦,除非你想编写自己的 JIT 编译器并在需要时 JIT 新的汇编代码。你可以这么做。但我真的不明白这一点,因为你仍然遇到同样的问题 - 如何选择要采用的代码路径,这将成为跳转表或 if/else 链。
There is no way to accomplish what you want, because they all boil down to the same thing- a jump table, or a large series of if/else. That's it. Any other feature is going to become just that. Just make a jump table. You could use an array of function pointers (the fastest) or something more flexible like an
unordered_map<int, std::function<void()>>
.Oh, unless you want to write your own JIT compiler and JIT the new assembly code when you need it. You could do that. But I don't really see the point, as you still run down to the same problem- how to pick the code path to take, which is going to become a jump table or if/else chain.