LINUX.ORG.RU

C++ typedef to function pointer

 


0

2

Учусь писать контейнер.

template<typename K, typename V>
class HashMap : public Map<K, V> {
public:
	typedef std::size_t(*hash)(const K & key);
	typedef std::size_t(*eq)(const K & fst, const K & snd);
        
        HashMap(hash hashFunction, eq eqFunction) :
		m_hash(hashFunction),
		m_eq(eqFunction) {
        ...
        }
};

Есть класс подобного вида.

Пытаюсь туда как аргумент передать:

std::hash<std::string> stdHash;
HashMap<std::string, int>::hash strHash = stdHash.operator();

Матюгается на вторую строку. Как передавать такую шнягу правильно?

Deleted

Написал так, но хочется покороче:

HashMap<std::string, Shape *>::hash strHash1 = [](const std::string & key) -> std::size_t {
	std::hash<std::string> hash;
	return hash(key);
};

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)

HashMap<>::hash - указатель на функцию, в то время как std::hash<>::operator()() - функция-член. Если прислушаться к КО - объяви тип hash так: typedef std::size_t(std::hash<K>::*hash)(const K& key);(не проверял синтаксическую корректность, если что смотреть указатели на члены классов). Но тогда ты только различные варианты std::hash<> сможешь использовать в качестве хэш-функции. По нормальному сделано в той же стандартной библиотеке, где хэш-функция - произвольная вызываемая сущность(+1 параметр шаблона)

Deleted
()
Ответ на: комментарий от Deleted

Почему это по стандарту не компилируется? Обернули в лямбду, вызвали непосредственно функцию-член. Тут нет передачи функции-члена как указателя.

Студия (о, эта боль университетская) тоже ничего не пикнула.

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)
Ответ на: комментарий от Deleted

По делу говоря, я не имею права вообще использовать C++11 в коде. Сделал для себя маленькое исключение в «тестовой программме».

А так:

C++98, делайте, как деды завещали!

Deleted
()
Ответ на: комментарий от Deleted

Тип лямбда-функции - анонимный объект. Система типов крестов не позволяет в указатель на функцию запихнуть адрес объекта(хоть и вызываемого). Другими словами - та же проблема, что и с std::hash<>

Deleted
()
Ответ на: комментарий от Deleted

C++11

Нет, нет. unordered контейнеры ещё со времён tr1(c++03) существуют, возможности c++11 там не принципиальны

Deleted
()
Ответ на: комментарий от Deleted

The closure type for a lambda-expression with no lambda-capture has a public non-virtual non-explicit const conversion function to pointer to function having the same parameter and return types as the closure type’s function call operator. The value returned by this conversion function shall be the address of a function that, when invoked, has the same effect as invoking the closure type’s function call operator.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

Раздел 5.1.2 примечание 6.

Так что компилироваться по стандарту должно как бы.

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

С какого стандарта?

Я с современным C++ отвратительно знаком. Можно считать, что C++11 знаю плохо, новее - не знаю совсем.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.