Лучший способ создать шаблонный метод (для одноэлементного класса), который получает шаблонный класс в качестве аргумента - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть одноэлементный класс, который является моим основным движком.

, так как я использую D3D11, и он использует тот же метод ID3D11Device для создания всех буферов (независимо от типа), я пытаюсь создать метод шаблона длясоздайте буферы.

и то, что я использую в качестве источника для буфера, это std :: array

, поэтому сейчас я пытаюсь:

template <size_t Size, typename T>
void CreateBuffer(BufferType bufferType, const std::array <T, Size>& source, ID3D11Buffer** out) {
    (...)
    bd.BindFlags = bufferType;
    bd.ByteWidth = sizeof(T) * source.size();
    (...)
}

, а затемЯ использую это как:

ID3D11Buffer* buffer = nullptr;
array <SimpleVertex, 10> data; //this is the source data, 10 simple vertices
D3DEngine::GetInstance().CreateBuffer <10> (D3DEngine::Vertex, data, &buffer);

это работает, но выглядит так некрасиво.что «10» в качестве шаблона аргумента заставляет меня «жестко задавать» размер (я даже не могу использовать <data.size()>, потому что для него требуется постоянная в качестве аргумента шаблона).

Есть ли лучший способ достичь того, чего я хочу?или я должен использовать другой подход?спасибо.

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Компилятор должен иметь возможность выводить аргументы как размера, так и типа.

Почему ваш двигатель синглтон? В этом нет особого смысла. И вы можете просто вернуть указатель, вместо того, чтобы взять указатель на него. И необработанный вместо указателя управления ресурсами? Рад, что я не поддерживаю твой код.

0 голосов
/ 16 декабря 2011

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

Это код:

#include <iostream>
#include <string>
#include <array>

template<size_t S, typename T> size_t CreateBuffer(std::string const & s, std::array<T, S> const & source)
{
    // do something
    return S;
}

int main(int argc, char ** argv)
{
    std::array<std::string, 10> arr;
    size_t ret = CreateBuffer("my string", arr);
    std::cout<<"Size: "<<ret;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...