假设我有一个函数模板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
可以用一些花哨的调用包装器完成吗?如果是这样,怎么样?
我担心这是不可能的......但是,现在我对它有很好的用处..
答案 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
不应该太难以理解...)。