我假装有可能但我不太确定.基本上我正在寻找的是一种在编译时切换使用默认构造函数或通过引用接受一个参数的构造函数的方法.
即
T* create<T>()
{
return new T(1); // if possible
}
T* create<T>()
{
return new T(); // fallback to here
}
Run Code Online (Sandbox Code Playgroud)
我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作,但它确实混淆了IntelliSense引擎,无论如何我认为你可以通过简单地使用默认参数来省略额外的功能.我已经使用VS 2010测试了这段代码,它编译得很好并按预期运行.
我没有VS2010检查它是否在那里编译,但以下匹配您的示例.
template <typename T> // if std::declval is not supported by VS10
typename std::add_rvalue_reference<T>::type declval();
template <typename T>
decltype(new T(declval<std::string>()))
create_(std::string param, int) { return new T(param); }
template <typename T>
T * create_(std::string, ...) { return new T(); }
template <typename T>
T * create(std::string param) { return create_<T>(param, 0); }
int main()
{
std::cout << *create<int>("a") << '\n';
std::cout << *create<std::string>("b") << '\n';
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
b
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |