3

テンプレートパラメータで指定された2Dまたは3Dに応じて、いくつかの幾何学的関数を特殊化しようとしています。問題のおもちゃバージョンの(非常に壊れた)コードを含めると最適です。

template <typename T, int d>
class Point
{
public:
    int x;
    int y;
    int z;

    T add ()
    {
        return T(0);
    }

    template <>
    T add <T, 2> ()
    {
        return x + y;
    }

    template <>
    T add <T, 3> ()
    {
        return x + y + z;
    }
};

このコードは無残にコンパイルに失敗します。テンプレートパラメータ形式とクラス定義のさまざまな組み合わせを試しましたが、「T」を一般化したまま、「d」で関数の特殊化を行う方法を見つけることができません。

私の実際のソリューションでは、2Dまたは3Dの場合に特化した、グラデーション、曲率、補間などを計算しようとしています。勾配計算のように、単に「d」パラメーターを使用してforループの反復を制限できるものもあります。補間のような他のものは、2Dと3Dのために別々の機能を必要とします。

どんなヒントも大歓迎です!

4

2 に答える 2

7

私はこの解決策を提案します:

template <typename T, int d> 
class Point : public Point<T, d-1>
{
   typedef Point<T, d-1> base;
   T m_value;
public:
    T add()
    {
        return m_value + base::add();
    }   

    //another method which returns you the point value
    template<int N>
    T get()
    {
       return N==d ? m_value : base::get<N>();
    }
};

template <typename T>
class Point<T,0>
{
protected:
    T add()
    {
        return T(); //default value which is zero for all builtin types
    }
    template<int N>
    T get() { return T(); }

};

このソリューションを使用すると、必要な数のポイントを設定できますが、ポイントは。より大きくなりzeroます。

Point<int,1> p1;  //contains 1 point
Point<int,2> p2;  //contains 2 points
Point<int,3> p3;  //contains 3 points
Point<int,4> p4;  //contains 4 points
Point<int,5> p5;  //contains 5 points

auto x1 = p5.get<1>(); //get first point
auto x3 = p5.get<3>(); //get third point
auto x4 = p5.get<4>(); //get fourth point

または、便宜上、次のtypedefを用意してください。

typedef Point<int,2> Point2D;
typedef Point<int,3> Point3D;

//then use them
Point2D p2d;
Point3D p3d;

これは基本的な考え方であり、さらに拡張して、多くの便利な機能をサポートすることができます。get<>便利そうな機能を1つ紹介するために書いたところです。

于 2012-12-31T05:22:37.570 に答える
5

これがあなたの例がどのように機能するかです。最初にプライマリテンプレートを宣言します。

template <typename T, int d> class Point;

一般的な実装がないため、定義する必要はありません。

次に、さまざまな次元数の部分的な特殊化を作成しますが、部分的な特殊化には、テンプレートパラメーターとしてタイプTが引き続き含まれます。

template <typename T>
class Point<T,2>
{
public:
    T x;
    T y;

    T add()
    {
        return x + y;
    }
};

template <typename T>
class Point<T,3>
{
public:
    T x;
    T y;
    T z;

    T add()
    {
        return x + y + z;
    }
};
于 2012-12-31T05:16:07.087 に答える