Ответ 1
Назовите тип возврата?
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(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;
}
Pre-С++ 1y (и post-С++ 1y тоже), вы можете использовать lambda для выполнения выписки типа возврата для вас, как в:
namespace
{
auto test = []
{
std::vector<int> ret;
ret.push_back(5);
ret.push_back(9);
return ret;
};
}