Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
#1

Шаблоны template с ограниченными параметрами - C++

19.09.2012, 12:45. Просмотров 2311. Ответов 41
Метки нет (Все метки)

Привет всем. У меня короткий вопрос.
например есть такой код:
C++
1
2
3
4
template <class T>
class MyVec {
    std::vector<T> m_vec;
};
Возможно ли сделать так чтобы MyVec работал только с определенными классами.
То есть, параметр шаблона T мог принимать только определенные мною значения (например MyClass1, int и всё, другие нельзя).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2012, 12:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны template с ограниченными параметрами (C++):

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

Шаблоны типа template<class T*> - C++
Здравствуйте, объясните пожалуйста, что означает сия запись: template&lt;class T*&gt;. И означает ли она, что я далее смогу использовать только...

подскажите template<class> (Шаблоны и указатели) - C++
circl.h #ifndef _CIRCL_H #define _CIRCL_H template &lt;class t&gt; class circl{ private: circl *pNext,*pBack; public: t...

Что за пустые шаблоны template <> struct/inline? - C++
что за пустые шаблоны template &lt;&gt; за которыми следуют class/struct/inline? По многочисленным источникам в c++ шаблоны имеют вид,...

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier - C++
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я прописываю тело функций внутри описания...

'MyQueue' : use of class template requires template argument list - C++
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки 'MyQueue' : use of class template...

41
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.09.2012, 12:57 #2
FireNovel, Нету концептов в С++. Можно static_assert замутить

C++
1
2
3
4
5
6
template<class T>
class MyVec
{
    static_assert(std::is_same<T, int>::value && std::is_same<T, MyClass1>::value, 
"only int and MyClass1");
};
2
Yosido
0 / 0 / 0
Регистрация: 23.02.2009
Сообщений: 7
19.09.2012, 12:59 #3
Как определить тип переменной?

Соответственное проверяешь результат, возвращаемый typeid().name(), и делаешь нужные действия.
0
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.09.2012, 13:00 #4
Yosido, Есть type_traits, что в бусте, что в С++11. Тут typeid явно хреновый помощник.
1
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 13:02 #5
можно попробовать замутить ченить типа списка типов в приватной части, в котором перечислить
те типы, для которых можно + статик ассерт с поиском по списку.
Если нужны какие-то особенные свойства, то тогда какой-нибудь компайл-тайм предикат с тем же статик ассертом.
0
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 13:15  [ТС] #6
ForEveR, вариант со static_assert(); понравился. Подкажи, пожалуйста, куда его пихать? и в каком он заголовке объявлен?
0
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.09.2012, 13:22 #7
FireNovel, Ни в каком. Это ключевое слово С++11. Пихать можно прям в начало класса.
0
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 13:23  [ТС] #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Это ключевое слово С++11.
Блин. Я в VS2008 пишу ( .
0
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.09.2012, 13:24 #9
FireNovel, Юзай boost. Или напиши свой static_assert.
0
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2012, 14:03 #10
FireNovel, да сделй ты 2 перегруженных функции(одну для int другую для MyClass1) или два класса аля intMyVec либо MyClass1MyVec и класс оболочку над ними, ёпт вариантов море!Иногда просто плакать хочется над проблемами которые тут рассматриваются
0
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.09.2012, 14:15 #11
-=ЮрА=-, Кхм. А не кажется-ли тебе, что писать несколько одинаковых реализациий класса для нескольких разных типов - это несколько перебор, если можно просто запретить создавать шаблон от других типов, кроме нужных? Тут все же куда логичнее использовать static_assert или некий концепт. Ну а если уж писать разные классы - тут дико напрашивается специализация класса, а не написание нескольких с разными названиями.
0
Jupiter
19.09.2012, 14:16
  #12

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
да сделй ты 2 перегруженных функции(одну для int другую для MyClass1) или два класса аля intMyVec либо MyClass1MyVec и класс оболочку над ними, ёпт вариантов море!Иногда просто плакать хочется над проблемами которые тут рассматриваются
потом будут плакать пользователи этого кода

3
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2012, 14:25 #13
Цитата Сообщение от Jupiter Посмотреть сообщение
потом будут плакать пользователи этого кода
- можешь плакать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <vector>
#include <iostream>
using namespace std;
 
class MyType
{
private:
    double p;
public:
    MyType(){p = 0;}
    MyType(double val){p = val;}
    MyType(const MyType & ptr)
    {
        p = ptr.p;
    }
    MyType operator+(double val)
    {
        return p + val;
    }
    MyType operator-(double val)
    {
        return p - val;
    }
    MyType operator/(double val)
    {
        return p / val;
    }
    MyType operator*(double val)
    {
        return p * val;
    }
};
 
class GybridContainer
{
private:
    vector<pair<int, MyType> > vec;
    typedef vector<pair<int, MyType> >::iterator iterator;
public:
    GybridContainer(){vec.clear();}
    void push_back(int val)
    {
        MyType p = 0;
        vec.push_back(make_pair(val, p));
    }
    void push_back(MyType val)
    {
        int p    = 0;
        vec.push_back(make_pair(p, val));
    }
    int atI(int i)
    {
        return vec.at(i).first;
    }
    MyType atT(int i)
    {
        return vec.at(i).second;
    }
};
 
int main()
{
    GybridContainer pContainer;
    for(int i = 0; i < 20; i++)
    {
        if(i%2)
            pContainer.push_back(i);
        else
            pContainer.push_back(100.0*i);
    }
    return 0;
}
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2012, 14:29 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- можешь плакать
Уже начинаю. Если мне понадобится не только int и MyValue, а ещё double? А через год дополнительно ещё bool и MyTemplateType<char>?

static_assert для этого требует только добавить три строки вида || TYPES_EQUAL(T, double)
3
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2012, 14:30 #15
ForEveR, я предпочитаю сесть написать что хочу а потом уже думать а модно ли это упростить или не можно.
Также само по себе задание просто дурацкое(не хочу обидеть ТС)
Цитата Сообщение от FireNovel Посмотреть сообщение
Возможно ли сделать так чтобы MyVec работал только с определенными классами.
- кому и зачем может такое понадобиться, ну вот просто зачем оно надо?
Не вопрос надо так надо - выше простой пример. Я зуб за 100 даю задание ТС решается куда более проще если узнать зачем оно надо, буз всяких шаблонов и прочего высокоуровневого кода, просто люди часто сами себе проблем придумают а потом решают...

Добавлено через 1 минуту

Не по теме:

~OhMyGodSoLong~, отвечу просто и лаконично ~OhMyGodSoLong~-ам слово не давали...

0
19.09.2012, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2012, 14:30
Привет! Вот еще темы с ответами:

Ошибка компиляции: template-id does not match any template declaration - C++
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; T maxn(T*, const int*); ...

В чем различие template <typename T> от template <class T> ? - C++
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

Visual Studio выдаёт ошибку при вынесении объявления функции с template в .h файл. Без template всё работает - C++
Проект содержит три файла: Source.cpp, arrTreat.h, arrTreat.cpp. Source.cpp: #include &lt;iostream&gt; using std::cout; using...

MSVC и template template classes - C++
Приветствую. Как в MSVC передать template template класс? Простой пример template&lt;template&lt;typename, typename&gt; class Return&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.