gpt4 book ai didi

c++ - 使用 SFINAE 检测编译器是否支持 std::atomic>

转载 作者:行者123 更新时间:2023-12-03 23:38:42 24 4
gpt4 key购买 nike

您可能知道,即使 C++20 添加了 std::atomic<std::shared_ptr<T>>标准的特化,大多数编译器还不支持它。我想知道我是否可以检测到 是否编译器是否支持这种特化或不使用 SFINAE。
我试着写这样的代码:

template<typename T, typename U=void>
struct details {
details() {
std::cout << "main\n";
}
};

template<typename T>
struct details<T, std::enable_if_t<std::is_constructible_v<std::atomic<T>>>> {
details() {
std::cout << "other\n";
}
};

int main() {
details<int> x;
details<std::shared_ptr<int>> y; //<-- error here
}
但这不起作用。我收到 details<std::shared_ptr<int>> 的错误消息它说它不能被创建,因为 shared_ptr<int>不是微不足道的可构造的。我认为这个错误会导致 other特化被忽略并且 main将被选中,但似乎我错了。
知道如何使用 SFINAE 检测此特化是否受支持吗?

最佳答案

不幸的是,我认为 SFINAE 永远不可能。使用 static_assert 在 STL 代码中进行检查关于 std::atomic<> 内的类型,所以对于 SFINAE 来说,过载总是可行的。只是在比赛后期static_assert火灾。
不幸的是,这不是 SFINAE 友好的技术。我对标准的阅读告诉我这是允许的,但是,它可以被视为“实现质量”问题。

关于c++ - 使用 SFINAE 检测编译器是否支持 std::atomic<std::shared_ptr<>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67474650/

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