0

假设我有一个函数模板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

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

我担心这是不可能的......但是,现在我有一个很好的用途......

4

3 回答 3

3

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

于 2013-02-07T22:55:38.820 回答
0

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

如果您希望函数每次都减少到相同的值,也许首先检查编译器是否自行执行(g++ -S -g不应该太难读......)。

于 2013-02-07T23:34:28.727 回答
0
template<class T> class impl {
    template<int count>
    static void funcImpl() {}
}

#define func funcImpl<__COUNTER__>

...

impl<float>::func()
于 2013-02-07T23:04:21.300 回答