Любопытно повторяющийся шаблон шаблона (CRTP) и производные аргументы конструктора

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

#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);
}

person Zulis    schedule 07.02.2015    source источник
comment
Вам придется удалить версию пересылки и создать перегрузки для каждого конструктора. Intellisense видит функциональный интерфейс таким, какой он есть, как он должен знать, что вы перешли к конструктору (для этого потребуется пройти через make_shared).   -  person jepio    schedule 08.02.2015
comment
@jepio Я серьезно не согласен! Я имею в виду, что этого делать не следует: и вы должны ориентировать свои проекты не на возможности вашей IDE, а на то, что компилируется и работает хорошо.   -  person πάντα ῥεῖ    schedule 08.02.2015
comment
Я не говорю, что он должен это сделать. Я говорю ему, что он должен будет сделать, и что невозможно / неразумно ожидать, что это сработает.   -  person jepio    schedule 08.02.2015


Ответы (1)


«Как передать список аргументов конструктора производного класса в Base, чтобы IntelliSense показывал мне, что доступные аргументы: (const std :: string & str, int i)?»

#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);
}

Что ж, ваш код просто компилируется.

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

person πάντα ῥεῖ    schedule 07.02.2015
comment
Он не спрашивал, как заставить код компилироваться (это уже было хорошо), он спрашивал, как изменить код, чтобы он хорошо работал с IntelliSense. Это никоим образом не отвечает на этот вопрос. - person ildjarn; 09.02.2015
comment
@ildjarn Я хорошо сказал, что код компилируется. Visual Studio не использует тот же синтаксический анализатор для кода C ++, который используется для компилятора. Есть ряд случаев, когда intellisense может не работать хорошо AFAIK. Следовательно, мое заявление полагаться на компилятор, а не на intellisense. - person πάντα ῥεῖ; 09.02.2015
comment
Что по-прежнему не отвечает на актуальный вопрос. - person ildjarn; 09.02.2015
comment
@Zulis Тогда вашим решением будет создание перегрузок для конструктора, как предложено в 1-м комментарии к вашему вопросу. - person πάντα ῥεῖ; 10.02.2015