c++ - 如何使用 decltype 实现不太通用的 std::is_constructible

标签 c++

我在这里冒险,假设这是可能的,但我不太确定。基本上我正在寻找的是一种在编译时在使用默认构造函数或通过引用采用一个参数的构造函数之间切换的方法。

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 header 并查看了 std::is_constructible 实现,然后我有点转过身来。我不明白人们是如何写代码的。 header 是我见过的最复杂的代码。无论如何,我看到它正在使用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 测试了这段代码,它可以正常编译并按预期运行。

最佳答案

我没有 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';
}

输出:

0
b

关于c++ - 如何使用 decltype 实现不太通用的 std::is_constructible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13730492/

相关文章:

c++ - 如果不同的线程正在调用另一个不同线程的相同信号,Qt 中是否需要互斥锁?

c++ - 如果将输入流发送到输出流会发生什么?

c++ - Windows 函数 "NetUserChangePassword"不再在 Windows 10 下工作(在 Windows 7 下工作)

c++ - std::cout<< x 之间的区别是什么?和 std::cout<<x<<std::endl;?

C++ --- 错误 C2664 : 'int scanf(const char *,...)' : cannot convert argument 1 from 'int' to 'const char *'

c++ - 如何使用函数对象作为回调来调用对象中的成员函数(处理程序)?

c++ - scanf 没有按预期工作

java - 将 OpenCV 方法从 Java 重写为 C++

c++ - 将 libgfortran 与 CMAKE 链接的可移植方式

c++ - 在 imageStore() 之后为 3D 纹理生成 MipMap 级别