Вывести функцию перегрузки с неизвестным типом во время компиляции - PullRequest
0 голосов
/ 10 февраля 2019

Я наткнулся на это, пытаясь очистить временную переменную.Это казалось достаточно интересным для обсуждения.

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 )

Вот упрощенный пример моей установки.Нечто подобное можно найти в конструкторах FCollisionObjectQueryParams UE4.


Компиляция выше приведёт к 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 и т. д.) , чтобы решить эту проблему.

1 Ответ

0 голосов
/ 10 февраля 2019

Вы можете просто переместить вызов конструктора вправо:

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

В C ++ 17 этот фрагмент будет работать, даже если MyType не копируется / не перемещается и будет вызывать только один конструктор.

...