我想将类成员函数的返回值存储在另一个类中。
这似乎有效:
class Foo
{
public:
Foo(int) {} //non default constructor that hides default constructor
unspecified_return_type get_value();
};
class Bar
{
// stores a value returned by Foo::get_value
decltype(Foo().get_value()) value;
};
但是有一个类Foo的默认构造函数的引用,在某些情况下可能没有定义。有没有办法在没有明确引用任何构造函数的情况下做到这一点?
答案 0 :(得分:9)
std::declval
(不需要依赖于特定的构造函数):
decltype(std::declval<Foo>().get_value()) value;
答案 1 :(得分:3)
你可以在std::declval
的帮助下完成,如下例所示:
#include <iostream>
#include <utility>
struct test {
int val = 10;
};
class Foo {
public:
test get_value() { return test(); }
};
class Bar {
public:
using type = decltype(std::declval<Foo>().get_value());
};
int main() {
Bar::type v;
std::cout << v.val << std::endl;
}
std::declval<T>
将任何类型T转换为引用类型,从而可以在decltype
表达式中使用成员函数,而无需通过构造函数。
std::declval
通常用于模板中,其中可接受的模板参数可能没有共同的构造函数,但具有需要返回类型的相同成员函数。