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

C++ C++;模板:使用隐式转换到模板实例化类型来选择重载函数!,c++,templates,overloading,C++,Templates,Overloading,考虑这些重载函数 void fun(Int2Type<1>) {} void fun(Int2Type<2>) {} void fun(Int2Type<3>) {} void fun(Int2Type<4>) {} 有办法吗?如果是,那么我们可以对一些运行时值做同样的操作,比如说, (请注意,在上述调用中,参数在编译时已知) 如果不可能的话,还有其他选择吗?目标是,根据不同的积分值调用不同的函数 编辑 顺便说一下,我不能使用以下任何一项:

考虑这些重载函数

void fun(Int2Type<1>) {}
void fun(Int2Type<2>) {}
void fun(Int2Type<3>) {}
void fun(Int2Type<4>) {}
有办法吗?如果是,那么我们可以对一些运行时值做同样的操作,比如说, (请注意,在上述调用中,参数在编译时已知)


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


编辑 顺便说一下,我不能使用以下任何一项:

  • 使用
    开关(值)
  • 使用some
    SomeFuncTable functable[]={fun(Int2Type()、fun(Int2Type()}

  • 不,无法将运行时值用作模板参数。您只能执行以下操作:

    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;
        }
    }
    
    void fun(int x){
    开关(x){
    案例1:
    乐趣(Int2Type());
    打破
    案例2:
    乐趣(Int2Type());
    打破
    案例3:
    乐趣(Int2Type());
    打破
    案例4:
    乐趣(Int2Type());
    打破
    }
    }
    
    不,无法将运行时值用作模板参数。您只能执行以下操作:

    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;
        }
    }
    
    void fun(int x){
    开关(x){
    案例1:
    乐趣(Int2Type());
    打破
    案例2:
    乐趣(Int2Type());
    打破
    案例3:
    乐趣(Int2Type());
    打破
    案例4:
    乐趣(Int2Type());
    打破
    }
    }
    
    没有办法实现您想要的,因为它们都归结为同一件事——一个跳转表,或者一系列if/else。就是这样。任何其他功能都会变成这样。只需创建一个跳转表。您可以使用一组函数指针(最快的)或者更灵活的东西,比如
    无序地图


    哦,除非你想编写自己的JIT编译器,并在需要时JIT新的汇编代码。你可以这样做。但我并不认为这有什么意义,因为你仍然会遇到同样的问题——如何选择要采用的代码路径,这将成为一个跳转表或if/else链。

    没有办法实现你想要的,因为嘿,所有这些都归结为同一件事——一个跳转表,或者一系列的if/else。就是这样。任何其他功能都会变成这样。只需制作一个跳转表。你可以使用一系列函数指针(最快的)或者更灵活的东西,比如
    无序映射


    哦,除非您想编写自己的JIT编译器,并在需要时JIT新的汇编代码。您可以这样做。但我并不认为这有什么意义,因为您仍然会遇到同样的问题—如何选择要采用的代码路径,这将成为一个跳转表或if/else链。

    您可以做得稍有不同:

    template<int N> void func();
    template<> void func<1>(){/*the body*/}
    template<> void func<2>(){/*the body*/}
    
    模板void func();
    模板void func(){/*正文*/}
    模板void func(){/*正文*/}
    
    然后您可以调用:
    func()

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


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

    您可以稍微改变一下:

    template<int N> void func();
    template<> void func<1>(){/*the body*/}
    template<> void func<2>(){/*the body*/}
    
    模板void func();
    模板void func(){/*正文*/}
    模板void func(){/*正文*/}
    
    然后您可以调用:
    func()

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


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

    我真诚地怀疑这是否可能,但如果确实存在,我很想知道答案。你没有提到Int2Type来自Loki。@漂亮的金发傻女孩:是的,我没有提到,所以?我真诚地怀疑这是否可能,但如果确实存在,我很想知道答案eed exist。你没有提到Int2Type来自Loki。@漂亮的金发傻女孩:是的,我没有提到,所以?我认为这是很好的实验。让我回家,我需要玩所有这些。谢谢你的帖子。:-)实际上,的全部目的是创建一个不同于int的类型,以便向不同的重载发送调用。我认为这是一个很好的尝试。让我回到主页,我需要处理所有这些。感谢您的帖子::-)实际上,的全部目的是创建一个不同于int的类型,以便将调用分派给不同的重载。