2010-12-14 58 views
0

考虑这些重载函数,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! 

或任何如果这是不可能的呢?目标是,根据不同的积分值调用不同的函数!


编辑

顺便说一句,我不能使用任何的以下内容:

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

我真诚地怀疑这是可能的,但如果确实存在,我们很乐意知道答案。 – acron 2010-12-14 12:30:14

+2

为什么不是? – Puppy 2010-12-14 12:33:48

+0

你没有提到Int2Type来自Loki。 – 2010-12-15 09:40:37

回答

2

你可以做不同的这一点:

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

然后您可致电:func<1>()

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

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

+0

我认为这是很好的尝试。让我到达家,我需要玩所有这些。感谢这篇文章。 :-) – Nawaz 2010-12-14 12:48:20

+0

实际上,[Int2Type](http://loki-lib.sourceforge.net/html/a00683.html)的整个目的是为了从** int **中按顺序创建**不同的类型**发送呼叫到不同的重载。 – 2010-12-14 12:52:36

2

没有,有没有办法将运行时值用作模板参数。你唯一可以做的事情是一样的东西:

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; 
    } 
} 
2

有没有办法来完成你想要的东西,因为他们都归结到同一个东西─跳转表,或者一个大系列的if/else。而已。任何其他功能将会变成这样。只需制作一张跳表。你可以使用一组函数指针(最快)或者更灵活的东西,比如unordered_map<int, std::function<void()>>

哦,除非你想编写自己的JIT编译器,并在需要时编译新的汇编代码。你可以做到这一点。但是我不明白这一点,因为你仍然遇到同样的问题 - 如何挑选代码路径,这将成为跳转表或if/else链。