Я определил класс в C ++, который содержит массив скаляров типа T
, для которого я хочу определить такие операторы, как sin, cos и т. Д. Для определения значения 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)
}
В настоящее время у меня есть код, который предоставляет соответствующую математическую библиотеку (используя пространство имен std;), а затем использую ::sin(a)
внутри функции sin для моего класса MyType
. Хотя это работает, это похоже на серьезный взлом.
Я вижу, что черты C ++ можно использовать для хранения информации, специфичной для экземпляра (например, какой набор математических функций использовать, когда T
равен double
, когда T
равен BigNum
и т. Д.)
Я хочу сделать что-то вроде этого: (Я знаю, что это не компилируется, но я надеюсь, что это передает то, что я хочу сделать)
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
), содержащее математические функции?