2012-12-07 2 views
0

last question에서 템플릿 특수화가 작동하는 데 큰 도움이되었습니다. 이제 약간의 확장이 필요합니다. 두 멤버 함수가 서로 다른 매개 변수 유형을 가지고,여러 가변 템플릿을 사용한 템플릿 전문화

class person 
{ 
private: 
    std::string name_; 
    int age_; 
public: 
    person(const std::string &name) 
     : name_(name), age_(56) 
    {} 
    void age(int a) { age_ = i; } 
    void name(const std::string &n) { name_ = n; } 
}; 

특별한 점은 다음과 같습니다

int main() 
{ 
    // First specialization 
    holder_ext<person> h1; 
    holder_ext<person, &person::age> h2; 
    holder_ext<int> h3; 

    // Second specialization 
    holder_ext<person, &person::age, &person::name> h4; 
} 

내 클래스 사람은 다음과 같습니다 : 나는이 문을 두 전문화를 원한다. 그래서 나는 둘 다 같은 variadic 템플릿 멤버 함수를 사용할 수 없다. 나는 2 개의 다른 가변성 템플렛으로 그것을 시도했다. 하지만 그건 효과가 없습니다. 또한 멤버 함수의 기본값은 작동하지 않습니다.

아무에게도 좋은 힌트가 있습니까? 사전에 다시

template < class T, void (std::conditional<std::is_class<T>::value, T, struct dummy>::type::* ...FUNC)(int)> class holder; 

template < class T, void (T::*FUNC)(int)> 
class holder<T, FUNC> 
{ 
public: 
    explicit holder() : setter(FUNC) { std::cout << "func\n"; } 
private: 
    std::function<void (value_type&, int)> setter; 
}; 

template < class T> 
class holder<T> 
{ 
public: 
    explicit holder() { std::cout << "plain\n"; } 
}; 

감사 :

이 (Pubby 덕분에) 하나 개의 멤버 함수와 솔루션입니다!

추신 : 아니, 나는 "3, 4, 5 가지 구성원 기능과 관련이있다"고 이틀 만에 나오지 않겠습니까? ;-)

답변

0

마지막으로 내 문제에 대한 해결책을 찾았습니다. Variadic 템플릿과 템플릿 specilization의 혼합입니다.

template < class T, 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int) = nullptr, 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::* ...FUNC2)(const std::string&) 
> 
class holder_ext; 

template < class T, 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int), 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC2)(const std::string&) 
> 
class holder_ext<T, FUNC1, FUNC2> 
{ 
public: 
    holder_ext() { std::cout << "func 2 test\n"; } 
}; 

template < class T, 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int) 
> 
class holder_ext<T, FUNC1> 
{ 
public: 
    holder_ext() { std::cout << "func 1 test\n"; } 
}; 

구현되지 않은 선언을 사용하고 두 가지 전문화를 정의합니다. 하나는 멤버 함수이고 다른 하나는 다른 모든 경우입니다.

더 나은 해결책이 있다면 저에게 말해 주십시요.

0

완전히 일반적인 솔루션의 경우 해결할 수없는 문제가 발생할 수 있습니다. 형식이 아닌 템플릿 인수의 유추를 유추 할 수 없으므로 템플릿 선언에서 명시 적이어야하므로 방법이 없습니다. 템플릿에 여러 개의 포인터 - 투 - 멤버 인자가 필요하다는 것을 알리면 각각은 아직 알려지지 않은 타입을 가질 것입니다.

나는 C++ 11만큼 연주하지 않은,하지만 당신은 멤버 템플릿 인수에 주문을 강제로 시도하고 템플릿에 모든 서명을 제공 할 수있다 : 그것을 다시

template <typename T, 
      void (std::conditional<...>::type*)(int), 
      void (std::conditional<...>::type*)(const std::string&)> 

, 작동 수도 있고 않을 수도 ...

+0

비슷한 변형을 시도했지만 어쩌면 정확히 동일한 변형을 시도하지 않았을 수도 있습니다. 그래서 나는 이것을 시도 할 것이다. – zussel