2022년 2월 27일 일요일

if constexpr 구문

 if constexpr 구문은 템플릿 함수가 컴파일 시에 동일한 함수 내에서 여러 범위를 평가할 수 있게 합니다.

1
2
3
4
5
6
7
8
struct Bear
{
    auto roar() const { std::cout << "Roar!\n"; }
};
struct Duck
{
    auto quack() const { std::cout << "Quack!\n"; }
};
cs

위와 같은 Bear와 Duck 클래스가 있을 때 의성어를 내는 메소드를 만든다고 가정해봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Animal 
{
    virtual ~Animal() {}
    virtual void speak() const {}
};
struct Bear : public Animal
{
    void roar() const { std::cout << "Roar!\n"; }
    void speak() const override { roar(); }
};
struct Duck: public Animal
{
    void quack() const { std::cout << "Quack!\n"; }
    void speak() const override  { quack(); }
};
cs

OOP관점에서 생각하자면 위와 같이 Animal이라는 클래스를 만들어 Bear와 Duck를 상속시켜주고 speak()과 같은 메소드에서 roar(), quack() 메소드를 각각 호출해주는 방법을 생각해볼 수 있습니다.


if constexpr 구문을 사용하면 상속을 사용하지 않고 컴파일 타임에 두 객체의 종류에 맞게 메소드를 호출할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Bear
{
    void roar() const { std::cout << "Roar!\n"; }
};
struct Duck
{
    void quack() const { std::cout << "Quack!\n"; }
};
 
template <typename Animal>
void speak(const Animal &a)
{
    if constexpr (std::is_same_v<Animal, Bear>)
    {
        a.roar();
    }
    else if constexpr (std::is_same_v<Animal, Duck>)
    {
        a.quack();
    }
}
cs

compile time에 연산이 수행되는 if constexpr 구문을 사용하는게 훨씬 효율적이라고 합니다.

Reference: 고성능을 위한 언어 C++

댓글 없음:

댓글 쓰기