テンプレートと混合型の推論とその明示的な割り当てに関する短いメモ

先日、 FITSファイルを操作するための独自のライブラリを作成することにしました。 はい、 CCFITSがあることは知っていますが、自転車を発明したかったのです。



このフォーマットの可能性の1つは、さまざまなタイプのデータをさまざまな次元の配列に書き込むことができることです。

これを行う明白な方法は、次のようなものを定義することです。



void setBytePix(int value); void setAxisSize(const std::vector<int> &axis );
      
      





ただし、この設計はあまり便利ではありません。 簡単なテストケース:



 std::vector srcVector; srcVector.push_back(1024); srcVector.push_back(1024); setAxisSize(srcVector);
      
      





std :: vectorの代わりにQtのQVectorがある場合、すべてがより良く見えるでしょう。



 setAxisSize(QVector<int>()<<1024<<1024);
      
      





しかし、これはSTLには当てはまりません。すぐにQtに参加したいと思います。 このスタイルで解決策が見つかりました。



 void setAxeSize(int number, int size); void setNumberDimension(int value); void setAxisDimensionP(int dimensionNumber, int axisSize){ setAxeSize(dimensionNumber, axisSize); } template<typename ...Arguments> void setAxisDimensionP(int dimensionNumber, int axisSize, Arguments... args){ setAxeSize(dimensionNumber, axisSize); ++dimensionNumber; setAxisDimensionP(dimensionNumber, args...); } template<typename ...Arguments> void setAxisSize(Arguments... args) { <s> setNumberDimension(sizeof...(args)/sizeof(int));</s> ( @AxisPod   ) setNumberDimension(sizeof...(args)); setAxisDimensionP(0, args...); }
      
      





より便利になりました:



 setAxisSize(1024, 1024);
      
      





次に、テンプレートとsetBytePixが必要になりました。 すぐに言ってやった:



 template <typename T> void setBytePix(){ setBytePix(sizeof(T)*8);}
      
      





食欲は高まっており、今では2つの機能ではなく、1つの機能を呼び出したいと思っています。 ワニについての悲しい思いを捨て、setAxisSizeをアップグレードします。



 template<typename T, typename ...Arguments> void setAxisSize(Arguments... args) { setBytePix<T>(); setNumberDimension(sizeof...(args)); setAxisDimensionP(0, args...); }
      
      





今すぐ試してください:



 setAxisSize<short>(1392,1032);
      
      





奇跡! 動作します!

PSはgcc 4.9.1でMinGWを使用しました



All Articles