Как вывести тип возврата функции, которая принимает ссылку в качестве параметра

StackOverflow https://stackoverflow.com//questions/22040359

Вопрос

Я пытаюсь вывести тип возврата функции и использовать его в качестве возвращаемого типа функции элементов.Для этого я использую выражение 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&>()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top