我试图推断出函数的返回类型,并将其用作成员函数的返回类型。为此我使用了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();
}
答案 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);
}
};