c ++ 11 — 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;
}

Который работает, но:

  1. Если я изменяю имя функции, я должен изменить

    decltype (тест ())

    в

    decltype (имя ())

  2. Если я изменяю параметры функции, я должен также изменить

    decltype (тест ())

    в

    decltype (тест (param1, param2))

Есть ли более элегантный способ сделать то же самое?

27

Решение

Назовите тип возвращаемого значения?

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

Пожалуйста, не заставляйте меня ограничивать это enable_if,

8

Другие решения

Вопрос парадоксальный:

В этом примере

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

функция должна предполагать, что decltype является контейнером, поддерживающим push_back с типом значения int. Нет способа предсказать это. Простое изменение типа возврата (на удвоение) сломает его.

4

Как насчет :

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

Это может выглядеть странно, но я думаю, что оно делает то, что вы хотите.

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

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

До C ++ 1y (и после C ++ 1y тоже), вы могли использовать лямбду, чтобы сделать вывод возвращаемого типа, как в:

namespace
{
auto test = []
{
std::vector<int> ret;
ret.push_back(5);
ret.push_back(9);
return ret;
};
}
1
По вопросам рекламы [email protected]