Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

подскажите 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++ шаблоны имеют вид,...

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

Задание массива с ограниченными значениями и интервалом - C++
Линейный массив содержит значения функции y=x-2 на интервале от 0 до 2 с шагом 0,1. Определить, сколько раз функция сменила знак? ...

Сравнение трех чисел ограниченными средствами - C++
У Дейтела после первой главы, где рассматриваются основы процедурного программирования, есть небольшой блок задач для самостоятельного...

Запуск C++ Builder 4.0 из-под пользователя с ограниченными правами - C++
Такой вопрос: Нужно установить C++ Builder 4.0 в компьютерном классе (такой старый, потому что другого лицензионного нет и возможности для...

Template - C++
Так не работает template&lt;typename TYPE&gt; struct TElem { TYPE data; TElem* next; int index; }; template&lt;typename TYPE&gt; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.09.2012, 12:57     Шаблоны template с ограниченными параметрами #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");
};
Yosido
0 / 0 / 0
Регистрация: 23.02.2009
Сообщений: 7
19.09.2012, 12:59     Шаблоны template с ограниченными параметрами #3
Как определить тип переменной?

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

Не по теме:

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

-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2012, 14:25     Шаблоны template с ограниченными параметрами #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;
}
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2012, 14:29     Шаблоны template с ограниченными параметрами #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- можешь плакать
Уже начинаю. Если мне понадобится не только int и MyValue, а ещё double? А через год дополнительно ещё bool и MyTemplateType<char>?

static_assert для этого требует только добавить три строки вида || TYPES_EQUAL(T, double)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2012, 14:30     Шаблоны template с ограниченными параметрами
Еще ссылки по теме:

template - C++
#include &lt;iostream&gt; #include &lt;string&gt; template &lt;class T, class S&gt; void foo(const T&amp; a, const S&amp; b) { ...

Template - C++
Доброго всем времени суток. Скажите, если я написал в хидере класса template &lt;typename T&gt; class matrix { //------- } что...

template и using - C++
Как правильго затемплейтить данный код?:#include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;string&gt; #include &lt;map&gt; #include...

Template - C++
Пишу на VS10. Имеется 3 файла: List.h #ifndef LIST_H #define LIST_H //DEList

String в template - C++
Здравствуйте. В программе используются преимущественно объекты класса string. Требуется иметь возможность передавать значение стринга в...


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

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

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

Не по теме:

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

Yandex
Объявления
19.09.2012, 14:30     Шаблоны template с ограниченными параметрами
Ответ Создать тему
Опции темы

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