Мне нужен функтор, который делает очень простую вещь, в основном это:
template<typename T>
struct Extract
{
T & operator()(T *t)
{
return *t;
}
};
Я не хочу копировать код, и я считаю, что такой простой и удобный кусок кода уже должен где-то существовать. Я пытался найти его, но безуспешно.
Я полагаю, вы хотите перебрать какой-нибудь контейнер и сделать что-нибудь с указателями в нем? Или даже построить функцию более высокого порядка на основе существующих (например, std :: plus & так далее)…
Для этого у библиотеки boost есть несколько решений:
оба способны работать не только с указателями raw, но и с поддержкой некоторых умных …
Во-первых, в вашем примере есть синтаксическая ошибка, я думаю, вы пытаетесь перегрузить оператор вызова функции как таковой:
template<typename T>
struct Extract
{
T& operator()(T *t)
{
return *t;
}
};
Далее кажется, что это преобразование указателя на ссылку. Вы можете сделать это используя std::ref
а также std::cref
в стандартной библиотеке. Они создают std::reference_wrapper
от значения, так что вы бы предпочли аргумент указателя перед отправкой std::ref
,
Как ваш используется:
Extract<int> ex;
int n = 1;
int* n_ptr = &n;
int& n2 = ex(n_ptr);
Как std::ref
будет использоваться:
int n = 1;
int* n_ptr = &n;
int& n2 = std::ref(*n_ptr);