2017-12-11 4 views
2

동안이 코드 배열의 크기를 확인합니다 :어떻게해야 컴파일 시간

template<char... Ts> 
class myIDClass 
{ 
protected: 
     std::vector<uint8_t> m_ID = { Ts... }; 

public: 
     std::vector<uint8_t> getID() 
     { 
      return m_ID; 
     } 
} 

을 나는이 방법을 사용할 수 있습니다

class MyClass: myIDClass<'1','2','3','4','5','6','7','8'> 
{ 
    // some code here 
} 

MyClass mc; 

그러나 나는 있는지 확인하려면 그 myIDClass를 사용하는 사람은 정확히 8자를 입력하여 클래스의 템플릿 매개 변수로 입력하십시오. 컴파일하는 동안 어떻게해야합니까?

어쨌든 static_asset을 사용하여이 작업을 수행 할 수 있습니까?

+4

크기가 컴파일 타임 상수 일 때'std :: array'가 아닌'std :: vector'를 사용하는 이유는 무엇입니까? – user463035818

+2

구식 방식의 문제점 : 8 개의 인수를 사용하는 생성자를 생성 하시겠습니까? – Bathsheba

+1

... variadic 매개 변수 목록을 왜 가변적으로 사용하지 않으려 고합니까? ;) – user463035818

답변

2

물론 : 당신은 당신이 정확히 8 값을 원하는 컴파일 타임에 알고 있기 때문에

template<char... Ts> 
class myIDClass 
{ 
    static_assert(sizeof...(Ts) == 8, "myIDClass needs 8 template arguments"); 

    // ... 

그러나, 대신 std::array를 사용할 수 있습니다

이 경우
#include <array> 
// ... 

template<char... Ts> 
class myIDClass 
{ 
    // The assertion is not actually needed, but you might still want to keep 
    // it so that the user of the template gets a better error message. 
    static_assert(sizeof...(Ts) == 8, "myIDClass needs 8 template arguments"); 

protected: 
    std::array<uint8_t, 8> m_ID = { Ts... }; 

public: 
    std::array<uint8_t, 8> getID() 
    { 
     return m_ID; 
    } 
}; 

, 필요하지 않은 더 이상 static_assert. 그러나 정확히 8 개의 인수를 사용하지 않을 때 템플릿의 사용자가 가져 오는 오류 메시지는 혼동을 줄 수 있습니다. 이 경우 어설 션은 더 나은 오류 메시지를내는 데 도움이됩니다.