2013-08-20 9 views
2

개인 데이터 멤버 (_val : class B)를 사용하는 것이 더 좋고 val을 템플릿 매개 변수()로하는 것이 더 좋은 경우?왜 상수 표현식을 템플릿 매개 변수로 사용합니까?

#include<iostream> 
using namespace std; 

template<int val> 
class A{ 
public: 
     A(){ cout << val << endl;} 
}; 

class B{ 
public: 
     B(int val) : _val(val) { cout << val << endl;} 
private: 
     int _val; 
}; 

int main() 
{ 
     A<7> a; 
     B b(8); 
} 
+3

런타임 중에 값을 변경 하시겠습니까? 그러면 거기에 대답이 있습니다. –

+1

@ chuck No. 템플릿은 컴파일 타임 구조입니다. – Rapptz

+0

@chuck, 객체'A <7> a '를 만든 후'val'을 7에서 8로 변경하는 방법은 무엇입니까? – cpp

답변

3

class A의 경우 만 설정하거나에만 런타임에 class B를 들어, 컴파일시에 val을 수정합니다. 따라서 클래스를 초기화/수정할 수있는 충분한 정보가있는시기에 따라 다릅니다. 또한 class B의 비 정적 데이터 멤버는 객체 별 상태를 추가합니다. 대신 static const int 또는 enum을 사용할 수 있으며 클래스 당 상태 만 추가합니다. C++ 11은 constexpr를 사용하고, 최종 결과, 클래스 A에 대한 어셈블리 코드로 문맥

class C { 
public: 
    constexpr C(int val) : _val(val) {} 
    constexpr int the_val() { return _val; } 
private: 
    int _val; 
} 

int main() 
{ 
    constexpr C c(5); 
    A<c.theval()> a; // uses constexpr to set template parameter at compile-time 
    B b(c.theval()); // can be done at compile-time, but not required ("quality of implementation") 
} 
0

에 따라, 컴파일 시간과 런타임에 모두 initalize 할 수있는 흥미로운

더, 하드 코딩되고 모든 사용 된 정수에 대해 클래스의 별도 버전이 존재합니다. 각 상수 litteral 정수에 대한 사용자 정의 클래스 .... 어떤 의미에서, 이것은 실행 속도를 갖기 위해 코드 크기를 증가시키려는 경우 갈 방법입니다.

클래스 B 생성자는 전달 된 실행 시간 변수가 정수인지 여부에 관계없이 동일합니다. 하나의 생성자이므로 사용하는 서로 다른 상수에 대해 코드 크기가 증가하지 않습니다.

관련 문제