【发布时间】: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