web-dev-qa-db-ja.com

現在の関数が返すタイプを推測するC ++ decltype

私が書いている関数の返されたタイプを自動的に推測したいと思います。例:

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

Wichは機能しますが:

  1. 関数名を変更する場合は変更する必要があります

    decltype(test())

    decltype(name())

  2. 関数パラメータを変更する場合は、同様に変更する必要があります

    decltype(test())

    decltype(test(param1、param2))

同じことをするよりエレガントな方法はありますか?

32
Luke Givens

戻り値の型に名前を付けますか?

template <typename T=std::vector<int>>
T test(){
    T ret;
    ret.Push_back(5);
    ret.Push_back(9);
    return ret;
}

これをenable_ifで制約させないでください。

8
Casey

問題はパラドックスです:

この例では

std::vector<int> test(){
    decltype(test()) ret;
    ret.Push_back(5);
    ret.Push_back(9);
    return ret;
}

関数は、decltypeが値型intのPush_backをサポートするコンテナーであると想定する必要があります。それを予測する方法はありません。戻り値の型を(doubleに)変更するだけで壊れます。

4
user2249683

これは奇妙に見えるかもしれませんが、私はそれがあなたがしたいことをしていると思います。

std::vector<int> create() { 
  std::vector<int> x;
  return x; 
}

auto myfunc() -> decltype(create()) {
  auto X = create();
  return X;
}
1
Alex

どうですか:

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

マクロなしではこれ以上良いものはないと思います:)

1
Drax

C++ 1yより前(およびC++ 1y以降も)では、次のようにラムダを使用して戻り値の型の推定を行うことができます。

namespace
{
    auto test = []
    {
        std::vector<int> ret;
        ret.Push_back(5);
        ret.Push_back(9);
        return ret;
    };
}
1
Nevin