2015-02-07 5 views
1

다음과 같이 공유 포인터를 만드는 데 이상한 반복 템플릿 패턴을 사용하고 있습니다 (아래). On Derived :: Create (...) Visual Studio IntelliSense는 사용 가능한 인수가 (Args & & ... args)보다 큼을 보여줍니다. 전달 방법 IntelliSense에서 사용 가능한 인수가 (const std :: string & str, int i)라고 표시되도록 파생 클래스 생성자 인수 목록을 Base에 전달하는 방법?CRTP (Curiously Recurring Template Pattern) 및 파생 생성자 인수

#include <memory> 
#include <string> 

template<typename T> 
class Base 
{ 
public: 
    template<typename... Args > 
    static std::shared_ptr<T> create(Args&&... args) 
    { 
     return std::make_shared<T>(std::forward<Args>(args)...); 
    } 
}; 

class Derived : public Base<Derived> 
{ 
public: 
    Derived(const std::string &str, int i) {} 
}; 

int main() 
{ 
    auto derived = Derived::create("text", 123); 
} 
+2

전달자 버전을 제거하고 각 생성자에 대한 오버로드를 만들어야합니다. Intellisense는 그것이 무엇인지에 대한 함수 인터페이스를 보았습니다. 생성자에게 전달한다는 것을 어떻게 알았습니까 (추가적으로 알아 내기 위해'make_shared '를 거쳐야 할 것입니다). – jepio

+0

@jepio 나는 심각하게 반대한다! 정확히 말하자면, "나는 IDE의 기능에 대해 디자인을 방향 지어서는 안되지만 컴파일되고 잘 작동하는 디자인을 사용해야합니다."_ –

+1

나는 그가 그렇게해야한다고 말하지 않습니다. 나는 그가해야 할 일과 그것이 일하기를 기대하는 것이 불가능하거나 부당하다는 것을 그에게 말하고 있습니다. – jepio

답변

0

"인텔리 사용할 인수가 있음을 보여줘 할 수 있도록하는 방법 (const를 표준 : : 문자열 & STR 내가 INT,) 자료에 파생 클래스 생성자 인수 목록을 전달하는?"

#include <string> 
#include <memory> 

template<typename T> 
class Base { 
public: 
    template<typename... Args > 
    static std::shared_ptr<T> create(Args&&... args) { 
     return std::make_shared<T>(std::forward<Args>(args)...); 
    } 
}; 

class Derived : public Base<Derived> { 
public: 
    Derived(const std::string &str, int i) {} 
}; 

int main() { 
    auto derived = Derived::create("text", 123); 
} 

글쎄, 당신의 code just compiles fine.

모든 IDE의 Intellisense 기능은 항상 사용되는 C++ 구문 분석기와 동일합니다. 이것은 실제로 사용 된 IDE에 따라 달라지며, IDE의 기능에 대한 설계 방향을 정하지 않아야합니다.하지만 실제로 컴파일되고 작동하는 것은 중요합니다.

+0

그는 코드를 컴파일하는 방법을 묻지 않았습니다. (이미 괜찮 았습니다.) IntelliSense로 멋지게 코드를 수정하는 방법을 물었습니다. 이것이 결코 그 질문에 대답하지 않습니다. – ildjarn

+0

@ildjarn 나는 코드가 컴파일됨을 잘 설명했다. Visual Studio는 컴파일러에 사용되는 것과 동일한 파서를 C++ 코드에 사용하지 않습니다. IntelliSense가 AFAIK에서 잘 작동하지 않을 수있는 경우가 많이 있습니다. 따라서 내 문장은 intellisense보다는 컴파일러에 의존합니다. –

+0

그래도 _ 실제 질문에 답하지 못했습니다. – ildjarn

관련 문제