T
sin、cosなどの演算子を定義したい型のスカラーの配列を保持するクラスをC ++で定義しました。sin
このクラスのオブジェクトに適用される意味を定義するには、適用される意味を知る必要がありますsin
。単一のスカラー型T
。これはT
、クラス内で適切な数学ライブラリ(スカラー型に対応)を使用する必要があることを意味します。現在のコードは次のとおりです。
template<class T>
class MyType<T>
{
private:
std::vector<T> list;
// ...
template<class U> friend const UTP<U> sin(const UTP<U>& a);
template<class U> friend const UTP<U> cos(const UTP<U>& a);
template<class U> friend const UTP<U> tan(const UTP<U>& a);
//...
};
template<class T> const UTP<T> sin(const UTP<T>& a)
{
// use the sin(..) appropriate for type T here
// if T were double I want to use double std::sin(double)
// if T were BigNum I want to use BigNum somelib::bigtype::sin(BigNum)
}
現在、適切な数学ライブラリを公開し(namespace std;を使用)::sin(a)
、クラスのsin関数内で使用するコードがありますMyType
。これは機能しますが、大きなハックのようです。
T
C ++特性を使用して、インスタンス固有の情報( is double
、when T
isBigNum
などの場合に使用する数学関数のセットなど)を格納できることがわかります。
私はこのようなことをしたいです:(これはコンパイルされないことは知っていますが、これが私がやりたいことを伝えてくれることを願っています)
template<T>
struct MyType_traits {
};
template<>
struct MyType_traits<double> {
namespace math = std;
};
template<>
struct MyType_traits<BigNum> {
namespace math = somelib::bigtype;
};
次に、MyTypeクラスを次のように再定義します。
template<T, traits = MyType_traits<T> >
class MyType
{
// ...
}
そしてtraits::math::sin
、私の友達機能で使用します。T
数学関数を含む正しい名前空間(によってパラメーター化された)を取得する方法はありますか?