2017-10-30 2 views
0

컴파일 타임 상수 값을 기반으로하는 함수에 코드가 포함되기를 원하지만 static_if는 C++의 구문이 아닙니다.If 컴파일 타임 const 문에 대한 문

그래서 나는이

class TA { 
public: 
    template<bool flag> 
    void func() { 
     if(flag) 
      a++; 
    } 

    int a; 
}; 


int main() { 
    TA a; 
    a.func<true>(); 
    a.func<false>(); 
} 

같은 기능을 쓸 수 있습니다 그리고 컴파일러는 두 가지 기능을 만드는 것을 내가 보증을 갖고 싶어. 하나는 'if (flag) a ++'가 함수로 컴파일되고 하나는 그렇지 않다는 것입니다.

이 보증은 C++ 17 표준을 기반으로 할 수 있습니까? 아니면 컴파일러 공급 업체의 자비하에 있습니까?

감사합니다.

+0

템플릿 인스턴스화는 항상 별도의 함수입니다. 'TA :: func '는'a ++'코드를 포함하지만 항상 건너 뛰겠습니까? – aschepler

+0

최적화가이를 처리해야하지만 템플릿을 전문화하고 각 부울 값 (true, false)을 두 번 겹쳐 쓸 수 있으므로 걱정할 필요는 없습니다. 그러나 다시 ... 조숙 한 최적화와 같은데, 당신이해서는 안된다. –

답변

3

실제 사실, C++ 17에는 정확히 묻는 내용이 포함되어 있습니다. if constexpr입니다.

당신은 어디서든 조건 (예 : 템플릿 인스턴스화 등) 컴파일시에 평가 될 수있다 사용할 수 있습니다

: 다른 사람이 예에서 당신은 많은을 얻을 가능성이있어, 말했듯이,

class TA { 
public: 
    template<bool flag> 
    void func() { 
     if constexpr (flag) 
      a++; 
    } 

    int a; 
}; 

그러나 컴파일러는 종종 이런 것들을 최적화 할 수 있습니다.

+0

'if constexpr'? 좋은! – Timo

+0

@ 티모 예프! 변수를 선언 할 때'constexpr'을 사용할 수도 있습니다 (C++ 11 이후부터).'constexpr bool c = true; 컴파일시'c'로 실패 할'constexpr'이 없으면 a.func ();' – Steve

+0

그래, 나는 이미 그것을 알고 있었다. 그러나 if 문은 나에게 새 것이 었습니다. 그리고 나는 그 특징을 정말로 좋아합니다. – Timo