Ошибка, связанная с шаблоном C ++ с XMVectorPermute - PullRequest
0 голосов
/ 15 февраля 2019

Я новичок в DirectX11 и пытаюсь адаптировать файл, написанный с использованием DirectX Legacy, к новому DirectX, но у меня возникли некоторые проблемы с шаблоном XMVectorPermute, который раньше был функцией в файле Legacy.

Я пытаюсь заставить компилятор распознавать шаблон в DirectXMath.h:

// General permute template
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
    inline XMVECTOR     XM_CALLCONV     XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)
{
   //...Definition

, используя следующий код:

template DirectX::XMVECTOR  DirectX::XMVectorPermute<PermuteXXY.i[0], PermuteXXY.i[1], PermuteXXY.i[2], PermuteXXY.i[3]>(FXMVECTOR V1, FXMVECTOR V2);

, в котором PermuteXXY определяется как:

static CONST DirectX::XMVECTORI32 PermuteXXY =
{
    DirectX::XM_PERMUTE_0X, DirectX::XM_PERMUTE_0X, DirectX::XM_PERMUTE_0Y, DirectX::XM_PERMUTE_0W
};

, но компилятор или компоновщик не может сопоставить: Сообщение об ошибке

XM_PERMUTE_... определяется как const uint32_t в DirectXMath.h, иXMVECTORI32 определяется как объединение:

union
    {
        int32_t i[4];
        XMVECTOR v;
    };

Я не очень хорош в шаблоне c ++, поэтому, пожалуйста, помогите мне в этом как можно более подробно.Большое спасибо!

1 Ответ

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

Здесь есть несколько проблем, которые приводят к сбою вашего кода.

Во-первых, вы не можете использовать элемент XMVECTORI32 для предоставления параметра шаблона для XMVectorPermute.Это не из-за разницы типов (то же самое происходит с XMVECTORU32).Я считаю, что проблема заключается в том, что массив i не объявлен как const, и значение должно быть постоянным, чтобы использоваться в качестве параметра шаблона.В любом случае VS2017 отказывается компилировать код.

Во-вторых, вы не можете специализировать шаблонную функцию, не предоставив тело для этой функции.Это будет означать, что ваша вторая строка не завершена, и вам понадобится реализация, написанная вами для компиляции.

Это не значит, что вы SOL, хотя вам просто нужно изменить свой подход.Если параметры шаблона всегда постоянны (и, похоже, они должны быть в вашем коде), вы можете определить функцию, которая принимает два векторных параметра и указывает точные константы перестановки, которые будут использоваться для этой конкретной операции.

Примером этого является следующий код:

DirectX::XMVECTOR XMVectorPermuteXXY(DirectX::FXMVECTOR V1, DirectX::FXMVECTOR V2)
{
    return DirectX::XMVectorPermute<DirectX::XM_PERMUTE_0X,
                                    DirectX::XM_PERMUTE_0X, 
                                    DirectX::XM_PERMUTE_0Y,
                                    DirectX::XM_PERMUTE_0W>(V1, V2);
}

Любые другие операции, которые необходимо указать (XYXY, ZZWW, YYWZ и т. Д.), Могут быть определены аналогичным образом,с функциями-обертками, которые определяют правильные параметры шаблона.

Второй вариант - использовать не шаблонную версию XMVectorPermute, которая принимает два вектора и четыре константы перестановки.Эта версия, вероятно, будет немного медленнее, но позволит вам указать константы перестановки во время выполнения.

Этот код выглядит следующим образом:

XMVECTOR XMVectorPermuteXXY(FXMVECTOR V1, FXMVECTOR V2)
{
    return XMVectorPermute(V1, V2, 
                           XM_PERMUTE_0X, 
                           XM_PERMUTE_0X, 
                           XM_PERMUTE_0Y, 
                           XM_PERMUTE_0W);
}

На основе кода, который выпосле миграции вам нужно решить, какую версию вы планируете использовать.

...