【问题标题】:Curiously recurring template pattern (CRTP) and derived constructor arguments奇怪的重复模板模式 (CRTP) 和派生的构造函数参数
【发布时间】:2015-02-07 20:58:58
【问题描述】:

我正在使用奇怪的重复模板模式以下列方式(如下)创建共享指针。在 Derived::create(...) 上,Visual Studio IntelliSense 显示可用参数为 (Args &&...args)。如何将派生类构造函数参数列表传递给 Base,以便 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);
}

【问题讨论】:

  • 您必须删除转发版本并为每个构造函数创建重载。 Intellisense 看到函数接口是什么,它应该如何知道你转发给构造函数(它还必须通过make_shared 才能弄清楚)。
  • @jepio 我严重不同意!这正是我的意思是不应该做的事情:“你不应该将你的设计定位于你的 IDE 的功能,而是编译和运行良好的东西。”
  • 我不是说他应该这样做。我告诉他他必须做什么,并且期望它起作用是不可能/不合理的。

标签: c++ c++11 intellisense variadic-templates crtp


【解决方案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);
}

好吧,你的code just compiles fine

任何 IDE 的 Intellisense 功能始终与用于它们的 c++ 解析器一样好。这完全取决于实际使用的 IDE,您的设计不应该针对 IDE 的功能,而是编译和运行良好的内容。

【讨论】:

  • 他没有问如何使代码编译(已经很好了),他问如何修改代码以与 IntelliSense 配合使用。这绝不是回答这个问题。
  • @ildjarn 我很好地说明了代码可以编译。 Visual Studio 对 c++ 代码的解析器与用于编译器的解析器不同。在许多情况下,智能感知可能无法正常工作 AFAIK。因此我的声明依赖于编译器而不是智能感知。
  • 这仍然没有回答实际问题
  • @Zulis 那么您的解决方案是为构造函数创建重载,正如您问题的第一条评论中所建议的那样。
猜你喜欢
  • 2013-02-15
  • 2019-11-18
相关资源
最近更新 更多