C ++ decltype推导当前函数返回类型

时间:2014-01-28 17:08:08

标签: c++ c++11 types decltype type-deduction

我想自动推断出我正在编写的函数的返回类型。 例如:

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

但是:

  1. 如果我更改功能名称,我必须更改

    decltype(试验())

    decltype(名称())

  2. 如果我改变功能参数,我必须改变

    decltype(试验())

    decltype(试验(参数1,参数2))

  3. 有更优雅的方式做同样的事吗?

5 个答案:

答案 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;
    };
}