在编译时推断出未知类型的函数重载
Deduce function overload with uknown type at compile time
我在尝试清理临时变量时偶然发现了这个问题。讨论起来似乎很有趣。
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
.
很明显应该将任一变量转换为具有匹配类型,因此类型在编译时已知,但是,我想知道是否存在语义,tricks/hacks,或新功能(c++17, etc.) 来解决这个问题。
您可以将构造函数调用移至右侧:
auto const my_obj{m_ArrayOfThings.IsEmpty() ? MyType{m_BitfieldOfThings} : MyType{m_ArrayOfThings}};
在 C++17 中,即使 MyType
不可复制/不可移动并且仅调用一个构造函数,此代码段也能正常工作。
我在尝试清理临时变量时偶然发现了这个问题。讨论起来似乎很有趣。
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
.
很明显应该将任一变量转换为具有匹配类型,因此类型在编译时已知,但是,我想知道是否存在语义,tricks/hacks,或新功能(c++17, etc.) 来解决这个问题。
您可以将构造函数调用移至右侧:
auto const my_obj{m_ArrayOfThings.IsEmpty() ? MyType{m_BitfieldOfThings} : MyType{m_ArrayOfThings}};
在 C++17 中,即使 MyType
不可复制/不可移动并且仅调用一个构造函数,此代码段也能正常工作。