在disable_if_same_or_driven情况下替换std::is_base_of_v

问题描述 投票:0回答:1

Eric Niebler 不久前写了一篇关于

Universal References
Copy Constructor
的文章:

尼伯勒

最后的解决方案是

template <typename A, typename B>
using disable_if_same_or_derived = std::enable_if_t<!std::is_base_of_v<A, std::remove_reference_t<B>>>;

这样做的缺点是 std::is_base_of_v 需要类型参数的完整定义。将其与转发类型一起使用是不可能的。

我现在可以使用 c++20,想知道我们是否可以为此找到解决方案。 你有什么想法吗?

c++ templates copy-constructor forwarding-reference
1个回答
0
投票

添加一个标记类型,如

std::emplace_t
等,将完美的转发构造函数标记为非复制/移动构造函数。

然后,在使用此类类型时,您可以在构造函数调用前加上

std::emplace_t
或类似的前缀。

这些标签类型的想法是它们是构造函数要遵循的“指令”。 当它们完成时,第一个参数“是……的基础”的测试将完成。

在极少数情况下,您实际上应该有一个类,将其构造函数参数转发到其他不透明的地方,而不具有特殊含义。 甚至是一个元组;即使在元组只有一个元素的情况下,我们也会构造元组的内容。

一旦我们有了“包装”的含义,我们就可以将其表达为标签指令。 该标记指令可以是显式的,并且它不会发挥作用并检测其其他参数的属性是什么。 这允许传递不完整的类型,而无需知道它们如何工作。

© www.soinside.com 2019 - 2024. All rights reserved.