DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31411
|
|
Рейтинг: 8952
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: vozbu]
21.06.2006 23:49
|
|
|
> Не совсем так, но мысль мою толкнул
имея под рукой раннее написанную библиотечку, можно и прямо так писать.
|
|
daemon
|
addict
|
|
|
|
Рег.: 10.02.2004
|
Сообщений: 514
|
Из: Первомайск
|
Рейтинг: 42
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: vozbu]
22.06.2006 15:54
|
|
|
Не совсем понятно, что нужно, напиши псевдокод. Ну как мы уже знаем, шаблоны си++ алгоритмически полная система, так что с ними можно сделать все что угодно
|
|
vozbu
|
karamba
|
|
|
|
Рег.: 14.11.2004
|
Сообщений: 4856
|
|
Рейтинг: 1057
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: daemon]
22.06.2006 16:01
|
|
|
Я лушче напишу, что в итоге получил:
code:
template <class T, class U> struct max_type { enum type_type {GENERAL, INTEGRAL, BIG_INTEGRAL, FLOATING_POINT}; static const type_type t_type = (boost::is_integral<T>::value)? INTEGRAL : (boost::is_same<T, int64_t>::value || boost::is_same<T, uint64_t>::value)? BIG_INTEGRAL : (boost::is_floating_point<T>::value)? FLOATING_POINT : GENERAL; static const type_type u_type = (boost::is_integral<U>::value)? INTEGRAL : (boost::is_same<U, int64_t>::value || boost::is_same<U, uint64_t>::value)? BIG_INTEGRAL : (boost::is_floating_point<U>::value)? FLOATING_POINT : GENERAL;
template <type_type selector1, type_type selector2> struct Result { typedef T type; };
template<type_type selector2> struct Result<FLOATING_POINT, selector2> { typedef double type; };
template<type_type selector2> struct Result<selector2, FLOATING_POINT> { typedef double type; };
template<> struct Result<INTEGRAL, BIG_INTEGRAL> { typedef U type; };
typedef typename Result<t_type, u_type>::type type; };
template <class T1, unsigned char Dim1, class T2 unsigned char Dim2> typename max_Type<T1, T2>::type scalarMult(const Vector<T1, Dim1>& v1, copnst Vector<T2, Dim2>& v2) { ... }
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
 |
|
daemon
|
addict
|
|
|
|
Рег.: 10.02.2004
|
Сообщений: 514
|
Из: Первомайск
|
Рейтинг: 42
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: vozbu]
22.06.2006 17:04
|
|
|
Ты сам понял как юзать селекторы для выведения типов или все таки чтото читал? Или смотрел код буста? Гляди, то что ты хочешь сделать, проще (имхо) можно сделать так. code:
#include <boost/mpl/if.hpp> #include <boost/type_traits/is_same.hpp> #include <boost/type_traits/is_integral.hpp> #include <boost/type_traits/is_floating_point.hpp> #include <typeinfo>
#include <iostream>
using std::cout;
template <typename T, unsigned char Dim> class Vector {
};
template <class T, class U> struct max_type { enum type_name {GENERAL, INTEGRAL, BIG_INTEGRAL, FLOATING_POINT}; static const type_name t_type = (boost::is_integral<T>::value) ? INTEGRAL : (boost::is_same<T, __int64>::value)? BIG_INTEGRAL : (boost::is_floating_point<T>::value)? FLOATING_POINT : GENERAL;
static const type_name u_type = (boost::is_integral<U>::value) ? INTEGRAL : (boost::is_same<U, __int64>::value) ? BIG_INTEGRAL : (boost::is_floating_point<U>::value)? FLOATING_POINT : GENERAL; static const bool _max = t_type > u_type; public: typedef typename boost::mpl::if_c< _max, typename T, typename U>::type type; };
template <typename T1, unsigned char Dim1, typename T2, unsigned char Dim2> typename max_type<T1, T2>::type scalarMult(const Vector<T1, Dim1>& v1, const Vector<T2, Dim2>& v2) { max_type<T1, T2>::type _result(0); cout << typeid(_result).name() << std::endl; return _result; }
int main() { Vector<int, 20> a; Vector<unsigned, 30> b; scalarMult(a, b); return 0; }
P. S. Говори, для чего вообще все это нужно, и скорей всего найдем библиотеку буста где это уже все сделано
|
|
vozbu
|
karamba
|
|
|
|
Рег.: 14.11.2004
|
Сообщений: 4856
|
|
Рейтинг: 1057
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: daemon]
22.06.2006 17:15
|
|
|
Это я написал на основе того, что уже есть в этом треде =) А про boost: :if_c не знал. Нужно для написания небольшой шаблонной библиотечки для работы с векторами и матрицами. Скажем, если ищется скалярное произведение двух векторов интегрального типа, то логично представить его в интегральном типе, если хотя бы один из сомножителей с плавающей точкой - то с плавающей точкой.
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
 |
|
daemon
|
addict
|
|
|
|
Рег.: 10.02.2004
|
Сообщений: 514
|
Из: Первомайск
|
Рейтинг: 42
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: vozbu]
22.06.2006 18:28
|
|
|
Попробуй посмотреть эти библиотеки
|
|
Alex
|
veteran
|
|
|
|
Рег.: 16.10.2002
|
Сообщений: 1940
|
Из: ЮЗАО
|
Рейтинг: 18
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: daemon]
22.06.2006 18:40
|
|
|
Глядя на подобные вещи начинаешь задумываться о применении ML вместо C++
|
|
vozbu
|
karamba
|
|
|
|
Рег.: 14.11.2004
|
Сообщений: 4856
|
|
Рейтинг: 1057
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: daemon]
22.06.2006 19:03
|
|
|
В ответ на:
typedef typename boost: :if_c< _max, typename T, typename U>::type type;
Не, это не то. Скажем, из <char, int> я получу int, а из <int, char> char.
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
 |
|
daemon
|
addict
|
|
|
|
Рег.: 10.02.2004
|
Сообщений: 514
|
Из: Первомайск
|
Рейтинг: 42
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: vozbu]
22.06.2006 19:38
|
|
|
В натуре) Так? static const bool _max = sizeof(T) > sizeof(U) || t_type > u_type;
|
|
vozbu
|
karamba
|
|
|
|
Рег.: 14.11.2004
|
Сообщений: 4856
|
|
Рейтинг: 1057
|
|
Re: [C++] шаблоны: помогите разобраться.
[re: daemon]
22.06.2006 19:45
|
|
|
Не, я хочу именно то, что написал - для интегральных типов получать int, для остальных double.
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
 |
|