본문 바로가기
프로그래밍/C++

C++11 주요 업데이트 : Initializer Lists, decltype, Template Aliases

by 머니테크리더 2023. 9. 30.
반응형

C++11 주요 업데이트 : Initializer Lists, decltype, Template Aliases
C++11 주요 업데이트 : Initializer Lists, decltype, Template Aliases

 

🔖 INDEX

     

     

    초기화 목록 (Initializer Lists)

    C++11에서 도입된 초기화 목록(Initializer Lists)은 중괄호 {}를 사용하여 여러 값으로 객체를 초기화할 수 있게 해주는 문법입니다. 이를 통해 배열, 컨테이너, 사용자 정의 타입 등의 객체 초기화가 간결하고 명료하게 이루어집니다.

     

    기본 사용 방법

    배열

    int arr[] = {1, 2, 3, 4, 5};

     

    STL 컨테이너

    std::vector<int> vec = {1, 2, 3, 4, 5};

     

    사용자 정의 타입

    class MyClass {
    private:
        int x, y;
    
    public:
        MyClass(int a, int b) : x(a), y(b) {}
    };
    
    MyClass obj = {3, 4}; // MyClass의 생성자를 사용하여 초기화

     

    std::initializer_list 타입

    C++11에서는 std::initializer_list라는 템플릿 클래스가 도입되었는데, 이는 초기화 목록으로 전달되는 값들을 저장합니다. 사용자 정의 타입에서 초기화 목록을 받아들이려면 std::initializer_list를 사용하면 됩니다.

    #include <initializer_list>
    
    class IntArray {
    private:
        std::vector<int> data;
    
    public:
        IntArray(std::initializer_list<int> list) : data(list) {}
    
        void print() {
            for (int val : data) {
                std::cout << val << " ";
            }
        }
    };
    
    int main() {
        IntArray arr = {1, 2, 3, 4, 5};
        arr.print(); // 1 2 3 4 5 출력
    }

     

    장점

    • 간결성: 초기화 목록을 사용하면 객체 초기화 코드가 더욱 간결해집니다.
    • 타입 안정성: 컴파일 타임에 초기화 데이터의 타입을 검사하여 타입 불일치 오류를 줄입니다.
    • 범용성: 다양한 타입의 객체에 대해 일관된 초기화 방식을 제공합니다.

     

    주의사항

    초기화 목록과 생성자 오버로드 간의 충돌이 발생할 수 있으므로 주의가 필요합니다. 초기화 목록이 우선적으로 고려되기 때문에 생성자의 정의와 초기화 목록을 혼동하지 않도록 주의해야 합니다.

     

     

    템플릿 형식 추론 및 decltype

    C++에서 템플릿은 코드의 재사용성을 극대화하기 위한 강력한 도구입니다. 특히, 템플릿 형식 추론과 decltype은 C++11에서 도입된 기능으로, 코드의 표현력과 유연성을 높여줍니다.

     

    템플릿 형식 추론

    템플릿 함수가 호출될 때, 컴파일러는 전달된 인수를 기반으로 템플릿 매개변수의 타입을 추론합니다.

    template <typename T>
    void print(const T& value) {
        std::cout << value << std::endl;
    }
    
    int main() {
        int a = 5;
        double b = 3.14;
    
        print(a);  // T는 int로 추론됨
        print(b);  // T는 double로 추론됨
    }

     

    decltype

    decltype은 표현식의 타입을 추론하여 그 타입을 반환하는 키워드입니다. 주로 템플릿 코드 내에서 연산의 결과 타입을 결정할 때 유용하게 사용됩니다.

    template <typename T, typename U>
    auto add(const T& a, const U& b) -> decltype(a + b) {
        return a + b;
    }
    
    int main() {
        int a = 5;
        double b = 3.14;
    
        auto result = add(a, b);  // decltype(a + b)는 double로 추론됨
        std::cout << result << std::endl; // 8.14 출력
    }

     

    decltype과 auto의 조합

    C++14부터는 반환 타입 추론을 위해 decltype과 auto를 조합해서 사용할 수 있습니다.

    template <typename T, typename U>
    auto add(const T& a, const U& b) {
        return a + b;  // 반환 타입은 'a + b'의 타입으로 자동 추론됨
    }

     

    장점

    • 코드 유연성: 특히, 복잡한 템플릿 코드에서 다양한 타입에 대응할 수 있게 됩니다.
    • 타입 안정성: decltype을 활용하면 연산 결과의 타입을 정확하게 추론할 수 있어, 예기치 않은 타입 변환 오류를 방지할 수 있습니다.

     

     

     

    템플릿 별칭 (Template Aliases)

    C++11부터는 "템플릿 별칭"이라는 기능이 도입되었습니다. 템플릿 별칭은 기존에 있는 타입에 대해 새로운 이름을 지정해주는 기능입니다. 특히 복잡한 템플릿 타입에 대해서 간결한 이름을 부여할 수 있어, 코드의 가독성이 크게 향상됩니다.

     

    기본 사용 방법

    템플릿 별칭을 정의할 때에는 using 키워드를 사용합니다.

    template <typename T>
    using Vec = std::vector<T>;
    
    Vec<int> intVector;  // std::vector<int>와 동일
    Vec<double> doubleVector;  // std::vector<double>와 동일

     

    복잡한 타입에 대한 별칭

    템플릿 별칭은 복잡한 템플릿 타입, 예를 들어, 함수 포인터나 맵 등에 대한 별칭을 제공하는데 특히 유용합니다.

    template <typename Key, typename Value>
    using MyMap = std::map<Key, std::pair<Value, bool>>;
    
    MyMap<std::string, int> exampleMap;

    위 예제에서 MyMap은 std::map에 대한 별칭으로, 값의 타입으로 std::pair<Value, bool>을 사용하게 됩니다.

     

    템플릿 별칭의 장점

    • 가독성 향상: 복잡한 템플릿 타입을 간결하게 표현하여 코드의 가독성을 크게 향상시킵니다.
    • 타입 정의의 일관성: 같은 타입에 대해 여러 부분에서 반복해서 사용할 때, 템플릿 별칭을 통해 일관된 타입 정의를 유지할 수 있습니다.
    • 코드 유지 보수: 타입을 수정해야 할 경우, 별칭을 정의한 한 곳만 수정하면 되므로 코드의 유지 보수가 용이해집니다.

     

     

     

    댓글