2016-05-20 8 views
4

Мне интересно, есть ли в C++ элемент макроса или языка, который представляет тот же тип, что и возвращаемое значение в функции.Функция языка C++ для упрощения типов имен (особенно в объявлениях функций)

Например:

std::vector<int> Myclass::CountToThree() const 
{ 
    std::vector<int> col; 
    col.push_back(1); 
    col.push_back(2); 
    col.push_back(3); 
    return col; 
} 

Вместо линии std::vector<int> col; есть какой-то элемент языка? Я знаю, что это довольно тривиально, но мне просто надоело печатать его ;-).

+1

Вы можете использовать 'typedef' или' using', если вам слишком скучно набирать длинные имена типов, например 'using vi = std :: vector ' и вводить 'vi col;' впоследствии. – delta

+2

У вас есть несколько вариантов, чтобы избежать повторения фактических типов переменных. Мой совет, что вы не используете никого из них :-) –

ответ

6

Вы можете сделать две вещи:

  1. Type aliasing, либо using или typedef.

    typedef std::vector<int> IntVector; 
    using IntVector = std::vector<int>; 
    

    Эти два объявления эквивалентны, и предоставить другое имя, которое компилятор трактует как синоним оригинального названия. Его также можно использовать для шаблонов.

    Почему две записи, а не только одна? Ключевое слово using было предоставлено на C++ 11 to simplify notation for typedefs in templates.

  2. В C++ 14, вы можете использовать auto ключевое слово для автоматического возврата типа удержания:

    auto Myclass::CountToThree() const 
    { 
        std::vector<int> col; 
        col.push_back(1); 
        col.push_back(2); 
        col.push_back(3); 
        return col; 
    } 
    

    Для более широкого объяснения см this related question.

2

Для примера, вы могли бы просто написать

std::vector<int> Myclass::CountToThree() const 
{ 
    return {1,2,3}; 
} 

В общем, вы можете получить тип возврата функции с decltype, но это, вероятно, не поможет в вашей ситуации: