如何计算函数模板实例

时间:2013-02-07 22:40:23

标签: c++ templates

假设我有一个函数模板func,并使用相同的模板参数多次实例化它。应计算具有相同模板参数的各个实例(从0开始),并且可以从func的实现访问实例计数。显然,静态成员不是我要搜索的。相反,我认为实例计数需要使用编译时类型计算来实现。

示例(用户代码):

{
  for(int i=0;i<10;i++) {
    func<float>();           // This should be instance number 0
  }
  func<float>();             // This should be instance number 1
}

尽管运行时循环,func的第一个实例得到数字0.这是在所有循环迭代中,实例编号不应该改变。只有当循环退出并再次调用该函数时,该数字才会递增,即为1。

原始模板:

template<class T> void func() {}

访问实例计数的可能方法:

template<class T,int COUNT> void func() {}   // instance number as template parameter
template<class T> void func(int count) {}    // or as function argument

可以用一些花哨的调用包装器完成吗?如果是这样,怎么样?

我担心这是不可能的......但是,现在我对它有很好的用处..

3 个答案:

答案 0 :(得分:3)

实例化的函数模板是一个函数。每个函数只在程序中存在一次。因此,您无法计算实例化,因为只有func<float>的单个实例化。

答案 1 :(得分:0)

template<class T> class impl {
    template<int count>
    static void funcImpl() {}
}

#define func funcImpl<__COUNTER__>

...

impl<float>::func()

答案 2 :(得分:0)

您在评论中解释的是您要缓存功能结果。这称为memoization。您应该创建一个完整的类来处理每个模板参数的函数memoization。

如果您希望函数每次都减少到相同的值,可能首先检查编译器是否单独执行此操作(g++ -S -g不应该太难以理解...)。