2012-07-28 2 views
0

템플릿 클래스가 있습니다. 클래스에는 각 템플릿 유형마다 다른 특정 값으로 사전 설정되어있는 private 멤버 변수가 있습니다.템플릿 유형에 따라 값을 사용하여 변수를 초기화하는 방법이 있습니까

다른 유형의 다른 생성자에 대해 생각해 보았습니다. 그러나 생성자에 매개 변수가 없으므로 어떻게해야하는지 잘 모릅니다.

어쨌든 사용할 수 있습니까?

감사합니다,

가 가장 쉬운 형태는

답변

1

당신은 종류에 전문화와 함께 할 수있다 :

#include <iostream> 

template <typename T> 
struct make { 
    static int value() { 
    return -1; // default 
    } 
}; 

template <> 
struct make<int> { 
    static int value() { 
    return 1; 
    } 
}; 

template <> 
struct make<double> { 
    static int value() { 
    return 2; 
    } 
}; 

template <typename T> 
struct foo { 
    const int val; 
    foo() : val(make<T>::value()) {} 
}; 

int main() { 
    std::cout << foo<int>().val << ", " << foo<double>().val << "\n"; 
} 

그러나 당신은 또한 과부하로 준비 수 :

#include <iostream> 

int value(void *) { 
    return -1; // default 
} 

int value(double *) { 
    return 2; 
} 

int value (int *) { 
    return 1; 
} 

template <typename T> 
struct foo { 
    const int val; 
    foo() : val(value(static_cast<T*>(nullptr))) {} 
}; 

int main() { 
    std::cout << foo<int>().val << ", " << foo<double>().val << "\n"; 
} 
0

템플릿 매개 변수의 값을 도우미 클래스의 값으로 매핑하여 다음과 같이 지정할 수 있습니다.

template<typename T> struct foo_helper; 
template<> struct foo_helper<int> { static int getValue() {return 1; } }; 
template<> struct foo_helper<float> { static int getValue() {return 2; } }; 
.... 


template<typename T> class foo 
{ 
    int m; 
    foo():m(foo_helper<T>::getValue()){} 

}; 
2

traits 템플릿을 사용하고 값으로 특수화하십시오. 예 :

template <typename T, typename Traits = MyTraits<T> > 
class MyClass { 
public: 
    int Foo() 
    { 
    return Traits::Value; 
    } 
}; 

template <> 
class MyTraits<SomeClass> 
{ 
public: 
    static int Value = 1; 
}; 

template <> 
class MyTraits<AnotherClass> 
{ 
public: 
    static int Value = 2; 
}; 
관련 문제