将函数指针传递给模板类

时间:2012-02-29 06:11:00

标签: c++ templates pointers

我有一个名为hash的模板类。我的模板类hash需要三个非类型参数。 hash类的定义如下:

template <typename array_type, typename ptr_to_hash, typename hash_type>
class hash
{
    public:
    //default constructor
    hash();

    /* Overloaded Constructors */

    // instantiates a hash object and the pointer to the hash_function

    hash(const int&, std::ifstream&, const char*, ptr_to_hash*);


    /* Methods for Hash Class */
    void insert_to_hash();

    // some other stuff    
};

正如您所看到的,我希望我的非类型参数ptr_to_hash成为我的函数void insert_to_hash的指针。上面重载的构造函数的实现如下:

template <typename array_type, typename ptr_to_hash, typename hash_type>
hash<array_type, ptr_to_hash, hash_type>::hash(const int& dim, std::ifstream& in, const char* file, ptr_to_hash* hash_ptr)
{
    // do some stuff to allocate from file

    // point function pointer to correct function
    hash_ptr = &this->insert_to_hash();
}

现在我正在尝试创建一个指向我的哈希函数的指针。所以我首先创建一个void函数指针,然后将其传递给我重载的构造函数:

int main()
{
    // create void function pointer
    void (*foo)();

    //create hash obj. from data read in from argv[1]
    hash< member<int>, void(*), member<int> > awesome( count_lines(in,file), in, file, foo);
}

在上面member<int>是一个模板结构,count_lines()只返回文件中数量行的整数值。当我尝试这样做时,我收到错误

no matching function for call to ‘hash<member<int>, void*, member<int> >::hash(int, std::ifstream&, const char*&, void (*&)())

当我查看上面的错误时,我似乎将foo函数指针对象传递为*&,这当然与我班级中的任何函数调用都不匹配。

这是我问题的症结所在。我不确定在使用模板时如何传递指向我void insert_to_hash()类中的hash的函数指针。我显然做错了。

3 个答案:

答案 0 :(得分:2)

作为参考的foo类型为void(&)(),指针为void(*)()。我将省略模板签名中的显式指针,并将其作为参数的一部分:

template <typename FPtr> void run(FPtr f) { f(); }

void foo() { /* ... */ }

// ...

run<void(*)()>(foo);

您也可以声明run(FRef * f) { f(); }并说run<void(&)()>(foo),但我不会打扰。没有办法在函数指针中有指针,所以你不妨将它吸收到参数类型本身。

答案 1 :(得分:1)

考虑使用lambda而不是函数指针。

hash< member<int>, void(*), member<int> > awesome( count_lines(in,file), in, file, [what ever you want to pass]{});

并且您的问题肯定是签名不匹配的问题,它明确指出您使用的函数的签名不是您声明的。

答案 2 :(得分:0)

您的代码存在一些问题。 首先,这一行

hash_ptr = &this->insert_to_hash();

试图使用&amp; RETURN的操作符从CALL到insert_hash()并将结果赋值给hash_ptr。

其次,如果你纠正了这个问题,你仍然试图将一个成员从一个对象实例分配给函数指针 - 你不能。如果您将insert_to_hash方法设为静态,则可以执行以下操作:

template <typename ptr_to_hash> class hash
{
public:
    hash( ptr_to_hash hash_ptr )
    {
        hash_ptr = insert_to_hash;
    }

    static void insert_to_hash()
    {
    }
};

int main( int argc, char *argv )
{
    void (*foo)();

    hash< void(*)() > awesome( foo );

    return 0;
}