gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:44:08 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com