Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для FireNovel
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297

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

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

Студворк — интернет-сервис помощи студентам
Привет всем. У меня короткий вопрос.
например есть такой код:
C++
1
2
3
4
template <class T>
class MyVec {
    std::vector<T> m_vec;
};
Возможно ли сделать так чтобы MyVec работал только с определенными классами.
То есть, параметр шаблона T мог принимать только определенные мною значения (например MyClass1, int и всё, другие нельзя).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2012, 12:45
Ответы с готовыми решениями:

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

Как вы применяете шаблоны template в C++?
Доброе утро! В C#, которым пользуюсь, есть возможность подстановки типа в класс. В C++ есть более широкое понятие о шаблонах. Какие есть...

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

41
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 12:57
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
0 / 0 / 0
Регистрация: 23.02.2009
Сообщений: 7
19.09.2012, 12:59
https://www.cyberforum.ru/post614069.html

Соответственное проверяешь результат, возвращаемый typeid().name(), и делаешь нужные действия.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 13:00
Yosido, Есть type_traits, что в бусте, что в С++11. Тут typeid явно хреновый помощник.
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 13:02
можно попробовать замутить ченить типа списка типов в приватной части, в котором перечислить
те типы, для которых можно + статик ассерт с поиском по списку.
Если нужны какие-то особенные свойства, то тогда какой-нибудь компайл-тайм предикат с тем же статик ассертом.
0
 Аватар для FireNovel
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 13:15  [ТС]
ForEveR, вариант со static_assert(); понравился. Подкажи, пожалуйста, куда его пихать? и в каком он заголовке объявлен?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 13:22
FireNovel, Ни в каком. Это ключевое слово С++11. Пихать можно прям в начало класса.
0
 Аватар для FireNovel
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 13:23  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
Это ключевое слово С++11.
Блин. Я в VS2008 пишу ( .
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 13:24
FireNovel, Юзай boost. Или напиши свой static_assert.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.09.2012, 14:03
FireNovel, да сделй ты 2 перегруженных функции(одну для int другую для MyClass1) или два класса аля intMyVec либо MyClass1MyVec и класс оболочку над ними, ёпт вариантов море!Иногда просто плакать хочется над проблемами которые тут рассматриваются
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 14:15
-=ЮрА=-, Кхм. А не кажется-ли тебе, что писать несколько одинаковых реализациий класса для нескольких разных типов - это несколько перебор, если можно просто запретить создавать шаблон от других типов, кроме нужных? Тут все же куда логичнее использовать static_assert или некий концепт. Ну а если уж писать разные классы - тут дико напрашивается специализация класса, а не написание нескольких с разными названиями.
0
19.09.2012, 14:16
Лучший ответ Сообщение было отмечено как решение

Решение

Не по теме:

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

3
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.09.2012, 14:25
Цитата Сообщение от 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
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2012, 14:29
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- можешь плакать
Уже начинаю. Если мне понадобится не только int и MyValue, а ещё double? А через год дополнительно ещё bool и MyTemplateType<char>?

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

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

Не по теме:

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

0
19.09.2012, 14:32

Не по теме:

У меня дежавю???????

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 14:37
Лучший ответ Сообщение было отмечено как решение

Решение

-=ЮрА=-, Правда? Не секрет ведь, что std::sort работает исключительно с RA итераторами. Используя к примеру для списка - получаем ошибку компиляции. К примеру в gcc это работает так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
     _Compare __comp)
    {
      typedef typename iterator_traits<_RandomAccessIterator>::value_type
    _ValueType;
 
      // concept requirements
      __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
        _RandomAccessIterator>)
      __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, _ValueType,
                  _ValueType>)
      __glibcxx_requires_valid_range(__first, __last);
Оп. Концепты. В VS работает примерно так же.

tuple.

C++
1
2
3
4
5
6
      template<typename... _UElements, typename = typename
           std::enable_if<sizeof...(_UElements)
                  == sizeof...(_Elements)>::type>
        explicit
        tuple(_UElements&&... __elements)
    : _Inherited(std::forward<_UElements>(__elements)...) { }
Будет принимать участие в выборе перегрузки только в том случае, если размеры списков типов - равны.

Не нужны, правда?
3
2395 / 1924 / 763
Регистрация: 27.07.2012
Сообщений: 5,569
19.09.2012, 14:41
если в лом качать boost, писать static_assert и прочее, можно поступить так:
C++
1
2
3
4
5
6
7
8
9
10
template <class T>
class MyVec;
 
template <>
class MyVec<int>
{ std::vector<int> my_vec; }
 
template <>
class MyVec<MyClass>
{ std::vector<MyClass> my_vec; }
Но опять же со всеми проблемами дублирования кода и жуткой нерасширяемости.

Поэтому самое красивое решение - список типов с нужным набором типов и static_assert на проверку совпадения каждого типа в списке шаблонному параметру.
0
19.09.2012, 14:43

Не по теме:


если в лом качать boost, писать static_assert и прочее, можно поступить так:
John Prick, -=ЮрА=- это и предлагал

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 14:43
soon, Нет. Юра предлагал два класса. Различных. О специализации Юра не говорил.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2012, 14:43
Помогаю со студенческими работами здесь

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

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

Шаблоны: ошибки: requires template argument list или undeclared identifier
Есть маленький тестовый проект из 4-файлов. Что мне надо - рассказывать словами замучаюсь, взляните пожалуйста на код по ссылке ниже (он...

Genfit() с ограниченными параметрами
Здравствуйте, я пытаюсь фитировать экпериментальные точки к некой фукнции с помощью genfit(). Эта функция зависит от нескольких параметров...

Template Toolkit шаблоны
Всем привет я новичек в Perl, поэтому вопрос может быть довольно глупый, не отсылайте плиз читать мануалы) вот код из русской...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru