gpt4 book ai didi

c++ - 在编译时推断出未知类型的函数重载

转载 作者:行者123 更新时间:2023-11-28 01:24:23 26 4
gpt4 key购买 nike

我在尝试清理临时变量时偶然发现了这一点。讨论起来似乎很有趣。

ArrayType m_ArrayOfThings;
INT32 m_BitfieldOfThings;

...


// Assume MyType has a ctor overload with argument ArrayType and another with int32.
const MyType my_obj( m_ArrayOfThings.IsEmpty() ? m_BitfieldOfThings : m_ArrayOfThings )

这是我的设置的一个简化示例。在 UE4 的 FCollisionObjectQueryParams 构造函数中可能会发现类似的内容。


编译以上内容将导致 error C2446: no conversion from 'INT32' to 'ArrayType',因为传递的类型在编译时未知。

auto temp = m_ArrayOfThings.IsEmpty() ? m_BitfieldOfThings : m_ArrayOfThings;
const MyType my_obj( temp );

这也会抛出:error C3536: 'temp': cannot be used before it is initialized

很明显,应该将任一变量转换为具有匹配类型,因此类型在编译时已知,但是,我想知道是否存在语义、技巧/技巧或新功能 (c++17等) 也可以解决这个问题。

最佳答案

您可以将构造函数调用移到右侧:

auto const my_obj{m_ArrayOfThings.IsEmpty() ? MyType{m_BitfieldOfThings} : MyType{m_ArrayOfThings}};

在 C++17 中,即使 MyType 是不可复制/不可移动的,并且只会调用一个构造函数,此代码段也能正常工作。

关于c++ - 在编译时推断出未知类型的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54613670/

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