2015-02-07 2 views
1

Я использую любопытно повторяющийся шаблон шаблона для создания общего указателя следующим образом (см. Ниже). On Derived :: create (...) Visual Studio IntelliSense показывает, чем доступные аргументы (Args & & ... args). Как передать список аргументов конструктора Derived class в Base, чтобы IntelliSense показывал мне, что доступными аргументами являются (const std :: string & str, int i)?Любопытно повторяющийся шаблон шаблона (CRTP) и производные аргументы конструктора

#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

«Как пройти производный класс списка конструктор аргумент для базы, так что IntelliSense покажет мне, что имеющиеся аргументы (Const станд :: строка & ул, внутр я)?»

#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.

Функции Intellisense любой IDE всегда так же хороши, как и парсер C++, используемый для них. Это полностью зависит от используемой IDE, и вы не должны ориентировать свои проекты на свои возможности IDE, но то, что компилируется и работает хорошо.

+0

Он не спрашивал, как сделать компиляцию кода (это было уже хорошо), он спросил, как изменить код, чтобы хорошо играть с IntelliSense. Это никоим образом не отвечает на этот вопрос. – ildjarn

+0

@ildjarn Я хорошо заявил, что код компилируется. Visual Studio не использует тот же синтаксический анализатор для кода C++, как он используется для компилятора. Существует ряд случаев, когда intellisense может плохо работать AFAIK. Следовательно, мое утверждение полагаться на компилятор, а не на intellisense. –

+0

Что еще не отвечает на _actual question_. – ildjarn

Смежные вопросы