如何推导出一个以引用为参数的函数的返回类型

时间:2014-02-26 11:44:22

标签: c++ c++11 pass-by-reference decltype return-type-deduction

我试图推断出函数的返回类型,并将其用作成员函数的返回类型。为此我使用了decltype表达式。但是如果给定的函数将引用作为参数,我的所有尝试都无法编译:

  • 我不能在decltype表达式中使用我的类的任何成员变量,因为编译器抱怨没有这样的成员(参见下面的func1
  • 我不能对函数参数使用临时函数,因为该函数需要引用,并且您不能将非常量左值引用绑定到临时(请参阅下面的func2

我还尝试了各种构造运算符,使引用成为临时引用,但似乎没有什么是有效的表达式。

这是一个代码示例:

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();
}

2 个答案:

答案 0 :(得分:2)

我认为你正在寻找std::declval<data_type&>()

答案 1 :(得分:1)

第一个失败是因为函数声明中的类没有完成,因为它在成员函数体中,所以你只能使用已经声明的成员。

对于第二个,标准库提供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);
    }
};