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++
댓글 없음:
댓글 쓰기