假设这是可能的,但我不太确定。基本上我正在寻找的是一种在编译时在使用默认构造函数或通过引用获取一个参数的构造函数之间切换的方法。
IE
T* create<T>()
{
return new T(1); // if possible
}
T* create<T>()
{
return new T(); // fallback to here
}
我正在使用 VS2010 编译器,它不支持std::is_constructible
,但我可以使用decltype
.
我深入研究了 VS2012 type_traits 标头并查看了std::is_constructible
实现,我有点转过身来。我不明白人们如何以这种方式编写代码。标头是我见过的最复杂的代码。无论如何,我看到它正在使用 decltype 并且让我思考,希望有经验的人可以为我提供答案。
经过@ipc的回答后,我确定了以下代码
// std::declval is not supported by VS2010
template <typename T> typename std::add_rvalue_reference<T>::type declval();
template <class T, class R0>
decltype(new T(declval<R0>()))
createInstance_(R0& r0, int = 0)
{
return new T(r0);
}
template <class T, class R0>
T*
createInstance_(R0&, ...)
{
return new T();
}
上面的代码可以工作,但它确实混淆了 IntelliSense 引擎,无论如何我认为你可以通过简单地使用默认参数来省略额外的函数。我已经用 VS 2010 测试了这段代码,它可以正常编译并按预期运行。