передать указатель на функцию в класс шаблона - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть шаблонный класс, который я назвал 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 ]

2 голосов
/ 29 февраля 2012

Тип foo в качестве ссылки void(&)(), а в качестве указателя - void(*)().Я бы пропустил явный указатель из подписи шаблона и позволил бы ему быть частью аргумента:

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

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

// ...

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

Вы также можете объявить run(FRef * f) { f(); } и сказать run<void(&)()>(foo), но я бы не стал беспокоиться.Нет никакого способа, чтобы не имел указатель в указателе функции, так что вы могли бы также включить его в сам тип аргумента.

1 голос
/ 29 февраля 2012

Подумайте об использовании лямбды вместо указателя функции.

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

, и ваша проблема определенно состоит в том, что из-за несоответствия сигнатур ясно говорится, что сигнатура функции, которую вы использовали, не та, которую вы объявили.

0 голосов
/ 29 февраля 2012

Есть несколько проблем с вашим кодом.Во-первых, эта строка

hash_ptr = &this->insert_to_hash();

пытается использовать оператор & на ВОЗВРАТЕ из 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...