Я хотел бы автоматически вывести возвращаемый тип функции, которую я пишу.
Пример:
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 (тест (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 является контейнером, поддерживающим push_back с типом значения int. Нет способа предсказать это. Простое изменение типа возврата (на удвоение) сломает его.
Как насчет :
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;
}
Я думаю, у тебя не будет ничего лучше без макросов 🙂
Это может выглядеть странно, но я думаю, что оно делает то, что вы хотите.
std::vector<int> create() {
std::vector<int> x;
return x;
}
auto myfunc() -> decltype(create()) {
auto X = create();
return X;
}
До C ++ 1y (и после C ++ 1y тоже), вы могли использовать лямбду, чтобы сделать вывод возвращаемого типа, как в:
namespace
{
auto test = []
{
std::vector<int> ret;
ret.push_back(5);
ret.push_back(9);
return ret;
};
}