2

テンプレートクラスがあります

template <class dataType>
class SSDFinder
{
   dataType a;
   dataType b;
public:
   void FindSSD();
}; 

実装は次のとおりです。

template<class dataType>
void SSDFinder<dataType>::FindSSD()
{
// some code. 
}

ここで、dataType が x、y などの 2 つの要素を持つか、x、y、z などの 3 つの要素を持つかに応じて、この関数 FindSSD を特殊化する必要があります。

2 つまたは 3 つの要素を持つ方法は複数あります。3 つの要素に特化し始めると、cv::Point2i、cv::Point2d を持つことができます。cv::Point2f、cv::Vec など。

3 エレメントの場合も同様です。

2 つの要素を持つすべての dataType が 1 つの特殊化のみを持つことができ、3 つの要素を持つすべての dataType が別の特殊化を持つことができるように、すべての特定のものを一緒にクラブする方法はありますか??

これらの dataTypes には size() などの関数はありません。それらにアクセスしようとする以外に、要素の数を見つけることができます。例のために。タイプ情報を取得するために dataType.type() を実行できませんでした。多くのデータ構造はそれを提供していません。

4

1 に答える 1

5

1 つの解決策は、特性クラスを作成して使用することstd::enable_ifです。

template<typename T>
struct has_2_elements
  { static const bool value = false; };

template<>
struct has_2_elements<cv::Point2i>
  { static const bool value = true; };

template<>
struct has_2_elements<cv::Point2d>
  { static const bool value = true; };

template<class dataType, typename = typename std::enable_if<has_2_elements<dataType>::value, void>::type>
void SSDFinder<dataType>::FindSSD()
{
    // some code. 
}

どのクラスが "2 つの要素を持つ" かを手動で判断する必要がありますが、関数から分離され、拡張が容易で、コード内の別の場所で再利用できます。

注: std::enable_ifは c++11 ですが、Boost で同等のものを見つけることができます。

于 2013-07-03T11:15:07.480 に答える