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

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 不可复制/不可移动并且仅调用一个构造函数,此代码段也能正常工作。