1

나는 재귀 적으로 작동해야하는이 함수를 가지고있다.부분 variadic 템플릿 함수의 특수화

template <class C, typename ...Arguments> 
void addStyleClassRecursive(C *c, Arguments... arg) 
{   
    c->addStyleClass(arg...); 
    for (unsigned int i=0; i<c->children().size(); ++i) 
    { 
     addStyleClassRecursive(c->children()[i], arg...); 
    }  
} 

는 이제 어떤 시점에서 내가하지 addStyleClass 멤버 함수가있는 클래스 (Wt::WObject)를 누릅니다 것을 발생하므로 컴파일러는이 문제에 대해 -rightly- 뿌려줍니다. 확인. 그래서 나는 Wt::WObject에 대한 버전을 추가하는 코드를 전문으로 생각 :

template <class C=Wt::WObject, typename ...Arguments> 
void addStyleClassRecursive(Wt::WObject *c, Arguments... arg) 
{ 
    for (unsigned int i=0; i<c->children().size(); ++i) 
    { 
     addStyleClassRecursive(c->children()[i], arg...); 
    } 
} 

이 그 자체 컴파일러 오류를 제공하지 않지만, 완전히 실제로 컴파일러에 대한 WObject 필요한 멤버를 가지고 있지 불평 계속 (무시 함수, 일반 함수 내에서 같은 행을 가리킴).

그래서 나는 이제 컴파일러에 대한 불만이 방법

template <typename ...Arguments> 
void addStyleClassRecursive<Wt::WObject, Arguments...>(Wt::WObject *c, Arguments... arg) 
{ 
    for (unsigned int i=0; i<c->children().size(); ++i) 
    { 
     addStyleClassRecursive(c->children()[i], arg...); 
    } 
} 

에 전문을 시도

non-type partial specialization 'addStyleClassRecursive<Wt::WObject, Arguments ...>' is not allowed 
void addStyleClassRecursive<Wt::WObject, Arguments...>(Wt::WObject *c, Arguments... arg); 
                         ^

그래서 누군가가 필요한 결과를 달성하는 방법을 지적 할 수 있습니까?

답변

2

당신은 같은 것을 할 수 있습니다

template <class C, typename ...Arguments> 
auto addStyleClassRecursiveImpl(int, C *c, Arguments... arg) 
-> decltype(c->addStyleClass(arg...), void()) { 
    c->addStyleClass(arg...); 
    // ... C has addStyleClass 
} 

template <class C, typename ...Arguments> 
void addStyleClassRecursiveImpl(char, C *c, Arguments... arg) { 
    // ... C has not addStyleClass 
} 

template <typename... T> 
void addStyleClassRecursive(T ...&&t) { 
    addStyleClassRecursiveImpl(0, std::forward<T>(t)...); 
    // ... 
} 

을 아이디어는 태그 파견 (예에서 addStyleClassRecursiveImpl이라고도 함) 내부 구현에 대한 요청 및 sfinae 및 기능을 선택하는 오버로드를 사용하는 것입니다 올바른 버전을 올리십시오.


물론 함수 템플릿을 부분적으로 특수화 할 수는 없습니다.

+0

작동하도록 약간의 변경을해야했지만 실제로는 플러그 앤 플레이 솔루션이었습니다. 감사. – DrHell

+1

@DrHell 휴대 전화에서 썼습니다. 오타가 있으면 용서해주세요. 나는 그것이 당신을 위해 일해서 다행입니다. – skypjack

+1

미안하지만, 나는 오만한 소리를 내고 싶지 않았습니다. 앞으로 누군가가 그것을 사용하기를 원할 때 약간의 변화가 필요하다고 설명했고 처음 실행했을 때 왜 효과가 없었는지 궁금해했습니다. 다시 한번 감사드립니다. :) – DrHell

2

기능 템플릿을 부분적으로 특수화 할 수 없습니다.

당신이 할 수있는 일은 재귀 템플릿이 첫 번째 가변 템플릿 arg에서 다른 함수를 호출하게하고 나머지 인수에서 재귀 적으로 호출하도록 허용하는 것입니다. 그런 다음 도우미 기능을 완전히 전문화 할 수 있습니다.