私が書いている関数の返されたタイプを自動的に推測したいと思います。例:
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は機能しますが:
関数名を変更する場合は変更する必要があります
decltype(test())
に
decltype(name())
関数パラメータを変更する場合は、同様に変更する必要があります
decltype(test())
に
decltype(test(param1、param2))
同じことをするよりエレガントな方法はありますか?
戻り値の型に名前を付けますか?
template <typename T=std::vector<int>>
T test(){
T ret;
ret.Push_back(5);
ret.Push_back(9);
return ret;
}
これをenable_if
で制約させないでください。
問題はパラドックスです:
この例では
std::vector<int> test(){
decltype(test()) ret;
ret.Push_back(5);
ret.Push_back(9);
return ret;
}
関数は、decltypeが値型intのPush_backをサポートするコンテナーであると想定する必要があります。それを予測する方法はありません。戻り値の型を(doubleに)変更するだけで壊れます。
これは奇妙に見えるかもしれませんが、私はそれがあなたがしたいことをしていると思います。
std::vector<int> create() {
std::vector<int> x;
return x;
}
auto myfunc() -> decltype(create()) {
auto X = create();
return X;
}
どうですか:
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;
}
マクロなしではこれ以上良いものはないと思います:)
C++ 1yより前(およびC++ 1y以降も)では、次のようにラムダを使用して戻り値の型の推定を行うことができます。
namespace
{
auto test = []
{
std::vector<int> ret;
ret.Push_back(5);
ret.Push_back(9);
return ret;
};
}