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

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

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

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

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если...

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

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

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

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

Соответственное проверяешь результат, возвращаемый typeid().name(), и делаешь нужные действия.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 13:00 4
Yosido, Есть type_traits, что в бусте, что в С++11. Тут typeid явно хреновый помощник.
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 13:02 5
можно попробовать замутить ченить типа списка типов в приватной части, в котором перечислить
те типы, для которых можно + статик ассерт с поиском по списку.
Если нужны какие-то особенные свойства, то тогда какой-нибудь компайл-тайм предикат с тем же статик ассертом.
0
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 13:15  [ТС] 6
ForEveR, вариант со static_assert(); понравился. Подкажи, пожалуйста, куда его пихать? и в каком он заголовке объявлен?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 13:22 7
FireNovel, Ни в каком. Это ключевое слово С++11. Пихать можно прям в начало класса.
0
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 13:23  [ТС] 8
Цитата Сообщение от ForEveR Посмотреть сообщение
Это ключевое слово С++11.
Блин. Я в VS2008 пишу ( .
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 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
defer
19.09.2012, 14:32
  #16

Не по теме:

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

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

Решение

-=ЮрА=-, Правда? Не секрет ведь, что 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
2276 / 1767 / 741
Регистрация: 27.07.2012
Сообщений: 5,250
19.09.2012, 14:41 18
если в лом качать 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
soon
19.09.2012, 14:43
  #19

Не по теме:


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

0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 14:43 20
soon, Нет. Юра предлагал два класса. Различных. О специализации Юра не говорил.
1
19.09.2012, 14:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2012, 14:43
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru