gpt4 book ai didi

c++ - 如何判断我是否正在转发到复制构造函数?

转载 作者:行者123 更新时间:2023-12-03 06:49:44 25 4
gpt4 key购买 nike

如果我正在编写一个将参数转发给构造函数的通用函数,有没有办法判断它是否是一个复制构造函数?基本上我想做:

template <typename T, typename... Args>
void CreateTAndDoSomething(Args&&... args) {
// Special case: if this is copy construction, do something different.
if constexpr (...) { ... }

// Otherwise do something else.
...
}
我想出的最好的方法是检查 sizeof...(args) == 1 然后查看 std::is_same_v<Args..., const T&> || std::is_same_v<Args..., T&> 。但我认为这错过了边缘情况,如 volatile 限定的输入和隐式转换为 T 的东西。
老实说,我不完全确定这个问题是明确定义的,所以请随时告诉我它不是(以及为什么)。如果它有帮助,您可以假设 T 的唯一单参数构造函数是 T(const T&)T(T&&)
如果我认为这没有明确定义是对的,因为复制构造函数不是事物,那么也许可以通过说“我如何判断表达式 T(std::forward<Args>(args)...) 是否选择接受 const T& 的重载?

最佳答案

您可以使用 remove_cv_t:

#include <type_traits>

template <typename T, typename... Args>
void CreateTAndDoSomething(Args&&... args) {
// Special case: if this is copy construction, do something different.
if constexpr (sizeof...(Args) == 1 && is_same_v<T&, remove_cv_t<Args...> >) { ... }

// Otherwise do something else.
...
}
这涵盖了所有“复制构造函数”,如 defined按照标准,不考虑可能的默认参数(很难确定给定的函数参数——对于给定这些参数将被调用的函数——是否默认)。

关于c++ - 如何判断我是否正在转发到复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64349383/

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