Использование класса JUCE HashMap с пользовательским классом и функцией ha sh - PullRequest
0 голосов
/ 23 апреля 2020

Я работаю над своим первым проектом на C ++ и использую инфраструктуру JUCE. (Я знаю некоторые основы c Java, в противном случае.)

В проекте мне нужно преобразовать пару целых чисел в другую пару целых чисел, в зависимости от отображения, считанного из файла. Класс JUCE HashMap казался идеальным для этого:

https://docs.juce.com/master/classHashMap.html

Я создал простой класс сумок "TwoInts" для хранения пар целых чисел, которые будут ключами и значения, и по понятным причинам мне нужно предоставить собственную функцию ha sh для этого класса:

Типы объектов ключа и значения задаются в качестве параметров шаблона. Вы также можете указать класс для предоставления функции ha sh, которая преобразует значение ключа в хешированное целое число. Этот класс должен иметь форму:

struct MyHashGenerator
{
    int generateHash (MyKeyType key, int upperLimit) const
    {
        // The function must return a value 0 <= x < upperLimit
        return someFunctionOfMyKeyType (key) % upperLimit;
    }
};

Я создал этот класс следующим образом:

struct MyHashGenerator
{
    int generateHash (TwoInts key, int upperLimit) const
    {
        String toHash;
        toHash+=String(key.getFirst());
        toHash+=STring(key.getSecond());
        return juce::DefaultHashFunctions::generateHash (toHash,upperLimit);
    }
};

Теперь у меня возникают проблемы с выяснением синтаксиса объявления и хотя инициализируем HashMaps.

В документации шаблон показан как

template<typename KeyType, typename ValueType, class HashFunctionType = DefaultHashFunctions, class TypeOfCriticalSectionToUse = DummyCriticalSection>

, а конструктор -

HashMap (int numberOfSlots=defaultHashTableSize, HashFunctionType hashFunction=HashFunctionType())

Лучше всего было объявить вот так :

HashMap<TwoInts,TwoInts,MyHashGenerator> translator;

и затем инициализируйте так:

:translator(1152, MyHashGenerator::generateHash())

Но это полуобразованное предположение приводит к ошибке. (нет соответствующей функции для вызова 'RelayerMApper: MyHashGenerator :: generateHa sh ()')

Может кто-то показать / объяснить синтаксис, который я должен использовать здесь?

Большое спасибо за любая помощь! Я хотел бы дать пару долларов на сумму Bitcoin Ca sh тому, кто сможет мне здесь помочь, просто чтобы показать, что я ценю ваше время и усилия.

Вот весь заголовочный файл, который я собираюсь Для справки:

#pragma once
#include "JuceHeader.h"
class RelayerMapper
{
    public:
    class TwoInts
        {
            public:
                TwoInts(){}
                TwoInts(int a, int b)
                {
                    first=a;
                    second=b;
                }
                int getFirst()
                {
                    return first;
                }
                int getSecond()
                {
                    return second;
                }
                void setFirst(int in)
                {
                    first=in;
                }
                void setSecond(int in)
                {
                    second=in;
                }
            private:
            int first, second;
        };
        struct MyHashGenerator
        {
            int generateHash (TwoInts key, int upperLimit) const
            {
                String toHash;
                toHash+=String(key.getFirst());
                toHash+=String(key.getSecond());
                return juce::DefaultHashFunctions::generateHash (toHash,upperLimit);
            }
        };
        RelayerMapper()
        :       dtMidiToCoords(1152, MyHashGenerator::generateHash()),
                coordsToDtMidi(1872, MyHashGenerator::generateHash()),
                axisToCoords(98)
        {}

        TwoInts MapDtMidiToCoords(TwoInts twoIntsIn, HashMap<TwoInts,TwoInts> hashmap)
        {
            return hashmap.getReference(twoIntsIn);
        }

    private:
    HashMap<TwoInts,TwoInts,MyHashGenerator> dtMidiToCoords;
    HashMap<TwoInts,TwoInts,MyHashGenerator> coordsToDtMidi;
    HashMap<int,TwoInts> axisToCoords;
};
...