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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> специализация шаблона для списка типов 
:(
    Опции темы
Alek86
Дата 20.2.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



не без помощи одолел проблему:

Код

enum TypeIs {Vacuous, InMultitude1, InMultitude2};

template <class T>
struct Condition {
  enum {
    Value =
    Condition1<T>::Right ? InMultitude1 : // sizeof(T) == 1
    Condition2<T>::Right ? InMultitude2 : // sizeof(T) == 2
    Vacuous
    };
};

template <class T>
struct Condition1 {
  enum {
    Right =
    (sizeof(T) == 1) ? true : false
  };
};

template <class T>
struct Condition2 {
  enum {
    Right =
    (sizeof(T) == 2) ? true : false
    };
};

template <class T, TypeIs = static_cast<TypeIs>(Condition<T>::Value)>
struct MainClass {
  enum {Value = 0};
};

template <class T>
struct MainClass<T, InMultitude1> {
  enum {Value = 10};
};

template <class T>
struct MainClass<T, InMultitude2> {
  enum {Value = 20};
};
1.
int main () {
  std::cout << "char  " << MainClass<char>::Value  << std::endl; // sizeof(T) == 1 => 10
  std::cout << "int   " << MainClass<int>::Value   << std::endl; // sizeof(T) == 4 => 0
  std::cout << "short " << MainClass<short>::Value << std::endl; // sizeof(T) == 2 => 20
};


на MVS 2005 пашет и правильно
осталась пара вопросов

1. это по стандарту такое поведение, что если в
Код
template <class T, TypeIs = static_cast<TypeIs>(Condition<T>::Value)>

Код
static_cast<TypeIs>(Condition<T>::Value)

возвращает InMultitude1, то даже несмотря на то, что компилятор уже начал, фактически, подставлять главный шаблон, он все равно еще раз пробегает по всем специализациям и находит
Код
template <class T>
struct MainClass<T, InMultitude1> {
  enum {Value = 10};
};

?

2. как-то можно избавиться в этом случае от статик каста в
Код
static_cast<TypeIs>(Condition<T>::Value)

?


--------------------
user posted image    user posted image
PM MAIL   Вверх
_stranger_
Дата 20.2.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 3.10.2006
Где: город-герой Киев

Репутация: 2
Всего: 2



Мне кажется проблемма не до конца решена, вот например посмотри подставляем long и double
Код

  std::cout << "char  " << MainClass<char>::Value  << std::endl; // sizeof(T) == 1 => 10
  std::cout << "int   " << MainClass<int>::Value   << std::endl; // sizeof(T) == 4 => 0
  std::cout << "short " << MainClass<short>::Value << std::endl; // sizeof(T) == 2 => 20
  std::cout << "long  " << MainClass<long>::Value  << std::endl;  //sizeof(T) == 4 => 0 вот тут тип не определен
  std::cout << "double  " << MainClass<double>::Value  << std::endl; //sizeof(T) == 8 => 0 и тут



я вот так пытался решить эту проблему с помощью списков типов, но тоже проблема до конца не решена:
Код

class NullType{};

template <class T,class U>
struct TypeList
{
    typedef T Head;
    typedef U Tail;
};

#define TYPELIST_1(T1)  TypeList<T1,NullType>
#define TYPELIST_2(T1,T2) TypeList<T1,TYPELIST_1(T2)>

template <class T>
void func(T& ptr)
{
    std::cout << "func" << std::endl;
}

template <class T>
void funcIntChar(T& ptr)
{
    std::cout << "funcIntChar" << std::endl;
}

template <class TList,class T>
class Wrapper
{
    typedef typename TList::Head Head;
    typedef typename TList::Tail Tail;
public:
    enum {value = (sizeof(Head) == sizeof(T))? 1:Wrapper<Tail,T>::value};
    void operator()(T temp)
    {
        if(value)
        {
            funcIntChar(temp);
        }
        else
        {
            func(temp);
        }
    }
};

template <class T>
class Wrapper<NullType,T>
{
public:
    enum {value = 0};
};
int main ()
{
    double x = 5.5;
    Wrapper<TYPELIST_2(int,char),double> Temp; //применение
    Temp(x);
}



Это сообщение отредактировал(а) _stranger_ - 20.2.2008, 11:36
PM MAIL   Вверх
Alek86
Дата 20.2.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Код

std::cout << "char  " << MainClass<char>::Value  << std::endl; // sizeof(T) == 1 => 10
  std::cout << "int   " << MainClass<int>::Value   << std::endl; // sizeof(T) == 4 => 0
  std::cout << "short " << MainClass<short>::Value << std::endl; // sizeof(T) == 2 => 20
  std::cout << "long  " << MainClass<long>::Value  << std::endl;  //sizeof(T) == 4 => 0 вот тут тип определен
  std::cout << "double  " << MainClass<double>::Value  << std::endl; //sizeof(T) == 8 => 0 и тут


у меня выводится все, как я ожидал
для sizeof(T) == 1          выводится 10
для sizeof(T) == 2          выводится 20
для остальных случаев выводится  0

sizeof тут чисто для проверки работы. вместо
Код
(sizeof(T) == N)
 можно подставить любое условие времени компиляции (и принадлежность к списку типов тоже)


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0851 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.