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>) {}
有办法吗?如果是,那么我们可以对一些运行时值做同样的操作,比如说,
(请注意,在上述调用中,参数在编译时已知)
如果不可能的话,还有其他选择吗?目标是,根据不同的积分值调用不同的函数
编辑 顺便说一下,我不能使用以下任何一项:
开关(值)
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的类型,以便将调用分派给不同的重载。