Как вывести тип возврата функции, которая принимает ссылку в качестве параметра
-
21-12-2019 - |
Вопрос
Я пытаюсь вывести тип возврата функции и использовать его в качестве возвращаемого типа функции элементов.Для этого я использую выражение DECLTYPE.Но все мои попытки не скомпилируются, если данная функция принимает ссылку в качестве аргумента:
- .
- Я не могу использовать какие-либо переменные элемента моего класса в выражении decltype, потому что компилятор жалуется, что таких членов нет (см. Генеракодицетагкод ниже)
- Я не могу использовать временную для параметра функции, поскольку функция принимает ссылку, и вы не можете связать ссылку Non-Const Lvalue на временную (см. Генеракодицетагкод ниже)
Я также попробовал различные операторы литейных операторов, чтобы составить ссылку воспользоваться временным, но ничто не кажется действительным выражением.
Здесь пример кода:
template<typename data_type, typename functor_type>
class MyClass
{
public:
auto func1() -> decltype(functor_type::process(this->m_data)) // <--
{
return functor_type::process(m_data);
}
auto func2() -> decltype(functor_type::process(data_type{})) // <--
{
return functor_type::process(m_data);
}
private:
data_type m_data;
};
struct Functor
{
static int process(int& a) { return a; }
};
int main()
{
MyClass<int, Functor> m;
int b = m.func1();
int c = m.func2();
}
. Решение
Первый провал, потому что класс не завершен в декларации функции, так как он находится в функциональных органах пользователя, поэтому вы можете использовать только участники, которые уже были объявлены.
Для второго стандартная библиотека предоставляет declval
, шаблон функции объявлен, чтобы вернуть его тип параметра шаблона.Вы можете использовать это в нерешинных контекстах, когда вам нужно выражение определенного типа.
Так что следующая версия должна работать:
#include <utility> // for declval
template<typename data_type, typename functor_type>
class MyClass
{
private:
// Declare this before `func1`
data_type m_data;
public:
// Use the already declared member variable
auto func1() -> decltype(functor_type::process(m_data))
{
return functor_type::process(m_data);
}
// Or use `declval` to get an expression with the required reference type
auto func2() -> decltype(functor_type::process(std::declval<data_type&>()))
{
return functor_type::process(m_data);
}
};
. Другие советы
Я думаю, что вы ищете std::declval<data_type&>()