函数作为具有THAT函数作为模板参数的类的字段的模板参数

时间:2016-06-07 11:32:19

标签: c++ templates function-pointers

在代码中解释它更容易。

示例

我有一个哈希图数据结构,其模板如下: -

template<class K,class T,long (* K_hashingFunction)(K&)> class AMap{
    //  ^ Key     ^Value       ^ Hashing function for Key
}

它按预期工作。

然后我想声明一个迭代器类: -

template<class K,class T,long (* K_hashingFunction)(K&)> class AMap_iterator{
    AMap<K,T, ????? >* mapPtr=nullptr; //How should I declare its type?
 }

问题:将 mapPtr 声明为字段的正确方法是什么?

AMap<K,T,  K_hashingFunction >* mapPtr=nullptr; //?
AMap<K,T, &K_hashingFunction >* mapPtr=nullptr; //?
AMap<K,T, *K_hashingFunction> * mapPtr=nullptr; //?

所有这些都给我一个智能感知错误:“不能替换模板参数”

2 个答案:

答案 0 :(得分:2)

这是正确的:

AMap<K,T,  K_hashingFunction >* mapPtr=nullptr; 

我们只是复制所有模板参数 - 无需修改。请注意,取消引用函数指针也应该有效,因为函数只会衰减回指针。

由于注入了类名,我们可以简化为:

AMap* mapPtr = nullptr;

答案 1 :(得分:1)

只是为了补充Barry的答案。

AMap<K,T, &K_hashingFunction >* mapPtr=nullptr;

不正确,因为表达式&K_hashingFunction会返回指向函数指针的指针。不是指向函数的指针