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

Поиск:

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

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



Можно ли так специализировать шаблон?

*.h
Код

class Some
{
    void process();
    template <typename T> void func();
};


*.cpp
Код

enum class E
{
    A, B
}
 
void Some::process()
{
    switch(...)
    {
        case E::A:
        {
            func(E::A);
            break;
        }
        ...
    }
}
 
template<> void Some::func<E::A>()
{
   ...
}

PM MAIL   Вверх
baldina
Дата 9.9.2015, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



E::A это не имя типа, а int
поэтому 
Код

template <int N> void func();

однако конструкция         
Код

case E::A:
            func(E::A);

выглядит не очень. например можно использовать map
вы чего в итоге добиваетесь, может найдется более изящное решение?

Добавлено через 2 минуты и 22 секунды
ЗЫ: специализацию вам надо описать раньше использования (или принудительно инстанцировать)
PM MAIL   Вверх
Cheloveck
Дата 9.9.2015, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



xbarmaglot, скорее всего baldina прав и тебе нужно что-то другое. Во всяком случае, в твоём абсолютно непонятно, чего ты хочешь добиться. Но, включив свои телепатические способности, могу предложить вот это:
Код

#include <iostream>

enum E
{
    A,
    B,
    C
};

class Some
{
public:
    template<E x>
    typename std::enable_if<x == E::A, void>::type func()
    {
        std::cout << "A\n";
    }
    template<E x>
    typename std::enable_if<x == E::B, void>::type func()
    {
        std::cout << "B\n";
    }
    template<E x>
    typename std::enable_if<x == E::C, void>::type func()
    {
        std::cout << "C\n";
    }
};

int main()
{
    Some some;
    some.func<E::A>();
    some.func<E::B>();
    some.func<E::C>();
    return 0;
}


Для этого кода требуется компилятор с поддержкой C++ 14!
https://ideone.com/JdsPf7


--------------------
user posted image
PM Jabber   Вверх
volatile
Дата 9.9.2015, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xbarmaglot @  8.9.2015,  14:55 Найти цитируемый пост)
class Some
{
    void process();
    template <typename T> void func();
};

описана функция не принимающая аргументов.

Цитата(xbarmaglot @  8.9.2015,  14:55 Найти цитируемый пост)
        case E::A:
        {
            func(E::A);
            break;
        }
        ...

а здесь вы вызываете другую функцию, которая здесь не описана...



Это сообщение отредактировал(а) volatile - 9.9.2015, 10:39
PM MAIL   Вверх
xbarmaglot
Дата 10.9.2015, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

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



Ну если более подробно объяснить, то есть типы пакетов
Код

enum class E { A, B, C, ... };


Далее приходит пакет на разборку и по сути все сводится к
Код

void parseA(...);
void parseB(...);
void parseC(...);
...


То есть вызов функций с одинаковым прототипом, которые нужно описать N раз - просто не вижу смысл захламлять описание...
PM MAIL   Вверх
volatile
Дата 10.9.2015, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



xbarmaglot, специализировать можно так
Код

enum class E
{
    A,B,C
};

class Some
{
public:
    template <E> void func();
};


template<> void Some::func<E::A>()
{
  ...
}
template<> void Some::func<E::B>()
{
  ...
}
template<> void Some::func<E::C>()
{
  ...
}


Добавлено @ 11:18
ну и вызывать их так:
Код

int main()
{
    Some some;
    some.func<E::A>();
    some.func<E::B>();
    some.func<E::C>();
}


Добавлено через 11 минут и 18 секунд
http://ideone.com/lPHYad

Это сообщение отредактировал(а) volatile - 10.9.2015, 11:18
PM MAIL   Вверх
xbarmaglot
Дата 10.9.2015, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

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



Я думал об этом, но не хотел типы тащить в описание класса, поэтому и думал, что можно <typename T>
PM MAIL   Вверх
volatile
Дата 10.9.2015, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В данном случае параметром шаблона является не тип, а перечислимое значение.
так что typename здесь не нужен.
PM MAIL   Вверх
xbarmaglot
Дата 10.9.2015, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

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



понятно. спасибо.

Еще вопрос

почему там можно
Код

enum S
{
   A, B
};

void func (int) {...}

func (S::A);


а так требует явного приведения типа
Код

enum class S
{
   A, B
};

void func (int) {...}

func (int(S::A));


PM MAIL   Вверх
volatile
Дата 10.9.2015, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xbarmaglot @ 10.9.2015,  12:46)
почему там можно
Код

enum S
{
   A, B
};

void func (int) {...}

func (S::A);
Здесь используется старый enum
Старый enum - это практически int, и компиллятор неявно приводил к инт, и обратно, не спрашивая.

Цитата(xbarmaglot @ 10.9.2015,  12:46)
а так требует явного приведения типа
Код

enum class S
{
   A, B
};

void func (int) {...}

func (int(S::A));
А здесь новый enum, появился в С++11.
Это уже полноценный тип, и компилятор неявно приводить к нему и из него ничего не будет.
Как собственно и должно быть.

Добавлено через 1 минуту и 39 секунд
http://www.cplusplus.com/forum/general/147341/
PM MAIL   Вверх
xbarmaglot
Дата 10.9.2015, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

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



спс
PM MAIL   Вверх
xbarmaglot
Дата 10.9.2015, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

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



volatile,  а если так

Код

enum class S : int
{
   A, B
};


то есть если я явно указываю тип Int. Тоже не канает?
PM MAIL   Вверх
volatile
Дата 10.9.2015, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xbarmaglot @  10.9.2015,  17:23 Найти цитируемый пост)
если я явно указываю тип Int

а он и так по умолчанию инт  smile 
это просто размер (ширина) целого, на основе которого будет строиться enum
т.е. разницы что  c ": int" что без него нет.
ну это мое имхо, эксперты поправят если что...  smile 

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.1822 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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