1

C++ で高価な 2D 関数を自動的に補間するメソッドを作成しました。私は現在、クラスが関数ポインタを受け入れられるようにして、任意の関数を補間できるようにしようとしています。これを行うには、関数ポインターを評価する必要があるオブジェクトごとにテンプレート化できるように、テンプレート化されたクラスが必要なようです。リンカーが必要な各オブジェクトのクラスをテンプレート化できるように、ヘッダーでクラスを完全に定義する必要があることに気付いた後、その部分はそれほど悪くありません。今こする。

クラス内では、boost::unordered_map を使用して関数の評価を保存し、関数を不必要に呼び出さないようにしています。補間中に、(曲率に基づいて) グリッドが十分に記述されるようにグリッドを調整します。元のポイントが x=0, .5, 1 にあった場合、次のセットは x=0, .25, .5, 1 になる可能性があるため、メッシュをローカルに細分化しています。 2 回目のパスでは x = .25。これは、動的関数ポインターの代わりに、ハードコードされた関数を使用して独自に機能しています。

私が抱えている問題は、boost::tuple に必要な operator と hash_value 関数を定義することです。ヘッダーに入れると、それらは複数回定義されます(ヘッダーのインクルードごとに)。オブジェクトとしてコンパイルしてリンクしようとすると、リンカーは定義を見つけることができません。クラスで参照する必要がある 2 つの定義:

bool operator==(const BoostTuple2D &a, const BoostTuple2D &b)
{
    return a.tuple.get<0>() == b.tuple.get<0>() &&
            a.tuple.get<1>() == b.tuple.get<1>();
}

std::size_t hash_value(const BoostTuple2D &e)
{
    std::size_t seed = 0;
    boost::hash_combine(seed, e.tuple.get<0>());
    boost::hash_combine(seed, e.tuple.get<1>());
    return seed;
}

私のヘッダーには、構造体と typedef があります。

struct BoostTuple2D {
    BoostTuple2D(double x1, double x2)
        : tuple(x1, x2) {}
    boost::tuples::tuple<double, double> tuple;
};

typedef boost::unordered_map< BoostTuple2D, double > BoostTuple2DMap;

これは、テンプレート化されたクラスのすぐ上にありますが、省略されています。

template<class F>
class Interpolate {
public:
    class Evaluate { 
    // this class uses the map to cache evaluations of the dynamic pointer
        }

    Interpolate (double (F::*f)(double, double), F & obj, [...]) : f(f), object(obj), ... {};

private:
    // members
};

operator== および hash_value メソッドを複数回定義せずにクラスで使用できるようにするにはどうすればよいですか? 私はヘッダファイルを守っています。私はC ++の初心者なので、うまくいけば、私が得ていない単純なものです。ありがとう!

4

1 に答える 1