Список инициализаторов с указателем на функцию - здесь есть хитрость? - PullRequest
2 голосов
/ 19 декабря 2011

Я читал учебник по элементарным структурам данных только для обзора - давно я написал свою собственную хэш-таблицу или красное / черное дерево:)

В любом случае, я столкнулся счто-то, что бросило меня немногоАвтор намерен использовать список инициализаторов для каждого члена (как можно было бы надеяться), но в этом единственном случае, когда он передает указатель на функцию хеширования, он предпочитает использовать оператор присваивания в конструкторе, а не устанавливатьвверх по указателю в списке инициализатора (и он также использует список инициализатора в этом коде):

template<class DataType>
HashTable<DataType>::HashTable(int (*hf)(const DataType&), int s)
    : table(s)
{
    hashfunc = hf;
}

, где:

int (*hashfunc)(const DataType&);

- закрытый член.

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

Ответы [ 2 ]

5 голосов
/ 19 декабря 2011

Нет, нет причин, по которым его нельзя инициализировать в списке инициализаторов.

Возможно, что ошибочный компилятор может запутаться и интерпретировать инициализацию в списке как вызов функции (так каксинтаксис похож);возможно, это объяснение.

2 голосов
/ 19 декабря 2011

Вы пытались создать typedef для вашего типа указателя на функцию:

template<class DataType>
struct HashTableTraits
{
    typedef int (*func_type)(const DataType&);
};

template<class DataType>
struct HashTable
{
    HashTable( 
        typename HashTableTraits<DataType>::func_type hf, int s )
    : table( s )
    , hashfunc( hf )
    {
    }

    int table;
    typename HashTableTraits<DataType>::func_type hashfunc;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...