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,想知道我们是否可以为此找到解决方案。 你有什么想法吗?
添加一个标记类型,如
std::emplace_t
等,将完美的转发构造函数标记为非复制/移动构造函数。
然后,在使用此类类型时,您可以在构造函数调用前加上
std::emplace_t
或类似的前缀。
这些标签类型的想法是它们是构造函数要遵循的“指令”。 当它们完成时,第一个参数“是……的基础”的测试将完成。
在极少数情况下,您实际上应该有一个类,将其构造函数参数转发到其他不透明的地方,而不具有特殊含义。 甚至是一个元组;即使在元组只有一个元素的情况下,我们也会构造元组的内容。
一旦我们有了“包装”的含义,我们就可以将其表达为标签指令。 该标记指令可以是显式的,并且它不会发挥作用并检测其其他参数的属性是什么。 这允许传递不完整的类型,而无需知道它们如何工作。