C++模板:使用隐式转换到模板实例化类型来选择重载函数!

发布于 2024-10-07 12:08:26 字数 701 浏览 1 评论 0 原文

考虑这些重载函数,

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!

或者如果不可能的话还有其他选择吗?目标是,根据不同的积分值调用不同的函数!


编辑

顺便说一下,我不能使用以下任何一个:

  1. 使用 switch(value)
  2. 使用一些 SomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2> ;()}

Consider these overloaded functions,

void fun(Int2Type<1>) {}
void fun(Int2Type<2>) {}
void fun(Int2Type<3>) {}
void fun(Int2Type<4>) {}

I want to call these in this way,

fun(1); // this should call first function
fun(4); // this should call fourth function

Is there a way to do that? If yes, so can we do the same with some runtime value, say this,
(please note that in the above calls, the argument is known at compile-time)

fun(value); // value can be decided at runtime!

Or any alternative if that is not possible? The goal is, different function should be called based on different integral value!


EDIT

By the way, I cannot use any of the following:

  1. Using switch(value)
  2. using some SomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2>()} etc

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

转身以后 2024-10-14 12:08:26

您可以采取一些不同的做法:

template<int N> void func();
template<> void func<1>(){/*the body*/}
template<> void func<2>(){/*the body*/}

然后您可以调用:func<1>()

或者您可以这样调用原始代码:func(Int2Type<1>())

无论如何,所有这些都仅适用于编译时常量。

You can do it a little differently:

template<int N> void func();
template<> void func<1>(){/*the body*/}
template<> void func<2>(){/*the body*/}

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.

把回忆走一遍 2024-10-14 12:08:26

不,无法使用运行时值作为模板参数。你唯一能做的就是:

void fun(int x) {
    switch(x) {
    case 1:
        fun(Int2Type<1>());
        break;
    case 2:
        fun(Int2Type<2>());
        break;
    case 3:
        fun(Int2Type<3>());
        break;
    case 4:
        fun(Int2Type<4>());
        break;
    }
}

No, there's no way to use runtime values as a template parameter. The only thing you can do is something like:

void fun(int x) {
    switch(x) {
    case 1:
        fun(Int2Type<1>());
        break;
    case 2:
        fun(Int2Type<2>());
        break;
    case 3:
        fun(Int2Type<3>());
        break;
    case 4:
        fun(Int2Type<4>());
        break;
    }
}
丶视觉 2024-10-14 12:08:26

没有办法实现你想要的,因为它们都归结为同一件事——跳转表,或者一大堆 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文