Подтвердить что ты не робот

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

Работает, но:

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

    decltype (тест())

    в

    decltype (имя())

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

    decltype (тест())

    в

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

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

4b9b3361

Ответ 1

Назовите тип возврата?

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

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

Ответ 2

Вопрос парадоксален:

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

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

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

Ответ 3

Как насчет:

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

Я думаю, что у вас не будет ничего лучше без макросов:)

Ответ 4

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

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

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

Ответ 5

Pre-С++ 1y (и post-С++ 1y тоже), вы можете использовать lambda для выполнения выписки типа возврата для вас, как в:

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