Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=4771840&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 20:48:17 2016
Кодировка: Windows-1251
[C++] шаблоны: помогите разобраться. - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 0 | 20 | показать все
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.



С тех пор, как изобрели речь, люди не могут договориться друг с другом.
Страницы: 0 | 20 | показать все

Technical >> Development (Archive)

Дополнительная информация
0 зарегистрированных и 1 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в