我想自动推断出我正在编写的函数的返回类型。 例如:
std::vector<int> test(){
decltype(this_function) ret;
ret.push_back(5);
ret.push_back(9);
return ret;
}
到目前为止,我所取得的最好成绩是
std::vector<int> test(){
decltype(test()) ret;
ret.push_back(5);
ret.push_back(9);
return ret;
}
但是:
如果我更改功能名称,我必须更改
decltype(试验())
到
decltype(名称())
如果我改变功能参数,我必须改变
decltype(试验())
到
decltype(试验(参数1,参数2))
有更优雅的方式做同样的事吗?
答案 0 :(得分:8)
命名返回类型?
template <typename T=std::vector<int>>
T test(){
T ret;
ret.push_back(5);
ret.push_back(9);
return ret;
}
请不要让我用enable_if
约束这个。
答案 1 :(得分:4)
问题是悖论:
在这个例子中
std::vector<int> test(){
decltype(test()) ret;
ret.push_back(5);
ret.push_back(9);
return ret;
}
该函数必须假设decltype是一个支持push_back的容器,其值类型为int。没有办法预测它。只需更改返回类型(加倍)就会破坏它。
答案 2 :(得分:1)
怎么样:
typedef std::vector<int> my_return_type;
my_return_type test(){
my_return_type ret;
ret.push_back(5);
ret.push_back(9);
return ret;
}
我认为如果没有宏,你将没有更好的东西:)
答案 3 :(得分:1)
这可能看起来很奇怪,但我认为它可以做你想做的事。
std::vector<int> create() {
std::vector<int> x;
return x;
}
auto myfunc() -> decltype(create()) {
auto X = create();
return X;
}
答案 4 :(得分:1)
Pre-C ++ 1y(以及后C ++ 1y),你可以使用lambda为你做返回类型演绎,如:
namespace
{
auto test = []
{
std::vector<int> ret;
ret.push_back(5);
ret.push_back(9);
return ret;
};
}