2011-12-16 5 views
0

私は主なエンジンであるシングルトンクラスを持っています。テンプレートクラスを引数として受け取る(シングルトンクラス用の)テンプレートメソッドを作成する最良の方法

D3D11を使用しているので、同じID3D11Deviceメソッドを使用してすべてのバッファを(型に関係なく)作成します.imはバッファを作成するテンプレートメソッドを作成しようとしています。

も私はバッファのソースとして使用することはstd ::配列です

はそう何イムは、これまでにしようとすると次のとおりです。

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()>を使用することさえできません)。

私が欲しいものを達成するには良い方法がありますか?または私は別のアプローチを使用する必要がありますか?ありがとう。

+1

CreateBuffer(D3DEngine ::頂点データ、およびバッファ)が微細であるべきです。あなたのコンパイラは何ですか? – Shawnone

+0

VS 2010のようにコンパイルしますが、.CreateBuffer()の呼び出しでクラッシュします。 – sap

+0

興味深い。私はVS2010で簡単なテストプログラムを作成し、CreateBuffer(const std :: array &source)を呼び出し、sizeof(T)、Size、およびsource.size()を出力します。すべてが良いです。 – Shawnone

答えて

1

コンパイラは、サイズ引数と型引数の両方を推測できるはずです。

あなたのエンジンはなぜシングルトンですか?そこには少しの点があります。ポインタをポインタに置くのではなく、ポインタを返すことができます。そして、リソース管理ポインタの代わりに生のポインタ?私はあなたのコードを維持していない喜んで。

+0

お返事ありがとうございます。コンパイラは両方の型を推論しますが、サイズを教えてくれないと、.CreateBuffer()が呼び出されるとプログラムがクラッシュします。私はちょうどそれが正しかったかどうかを確認するためにサイズを知ることはできません、それはちょうどメソッドの呼び出しでクラッシュしました。ポインタを取る代わりにリターンバッファーとして私は例外を使用するので、多分(特にシングルトンで)行く最善の方法ではないが、私はちょうど物事を終わらせようとしていると病気後にそれをきれいにしようとしています。 – sap

+1

@sap:それはまったく別の問題です。 – Puppy

+1

私たちはほとんど後にきれ​​いになることはありません。私たちは維持する。しかし、クリーンアップしないでください。それを正しい方法で行う方が良い。あなたの上司と一緒に仕事をして、遅くに滞在し、翌日早く出発してください。 –

0

私は素早くtest-caseを作成しました。これは、手動で配列のサイズを指定することなく動作するようです。

これはコードである:

#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; 
} 
関連する問題