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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 12:45     Шаблоны template с ограниченными параметрами #1
Привет всем. У меня короткий вопрос.
например есть такой код:
C++
1
2
3
4
template <class T>
class MyVec {
    std::vector<T> m_vec;
};
Возможно ли сделать так чтобы MyVec работал только с определенными классами.
То есть, параметр шаблона T мог принимать только определенные мною значения (например MyClass1, int и всё, другие нельзя).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2012, 13:00     Шаблоны template с ограниченными параметрами #4
Yosido, Есть type_traits, что в бусте, что в С++11. Тут typeid явно хреновый помощник.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 13:02     Шаблоны template с ограниченными параметрами #5
можно попробовать замутить ченить типа списка типов в приватной части, в котором перечислить
те типы, для которых можно + статик ассерт с поиском по списку.
Если нужны какие-то особенные свойства, то тогда какой-нибудь компайл-тайм предикат с тем же статик ассертом.
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 13:15  [ТС]     Шаблоны template с ограниченными параметрами #6
ForEveR, вариант со static_assert(); понравился. Подкажи, пожалуйста, куда его пихать? и в каком он заголовке объявлен?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2012, 13:22     Шаблоны template с ограниченными параметрами #7
FireNovel, Ни в каком. Это ключевое слово С++11. Пихать можно прям в начало класса.
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 13:23  [ТС]     Шаблоны template с ограниченными параметрами #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Это ключевое слово С++11.
Блин. Я в VS2008 пишу ( .
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 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)
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2012, 14:30     Шаблоны template с ограниченными параметрами #15
ForEveR, я предпочитаю сесть написать что хочу а потом уже думать а модно ли это упростить или не можно.
Также само по себе задание просто дурацкое(не хочу обидеть ТС)
Цитата Сообщение от FireNovel Посмотреть сообщение
Возможно ли сделать так чтобы MyVec работал только с определенными классами.
- кому и зачем может такое понадобиться, ну вот просто зачем оно надо?
Не вопрос надо так надо - выше простой пример. Я зуб за 100 даю задание ТС решается куда более проще если узнать зачем оно надо, буз всяких шаблонов и прочего высокоуровневого кода, просто люди часто сами себе проблем придумают а потом решают...

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

Не по теме:

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

defer
19.09.2012, 14:32
  #16

Не по теме:

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

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2012, 14:37     Шаблоны template с ограниченными параметрами #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)...) { }
Будет принимать участие в выборе перегрузки только в том случае, если размеры списков типов - равны.

Не нужны, правда?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.09.2012, 14:41     Шаблоны template с ограниченными параметрами #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 на проверку совпадения каждого типа в списке шаблонному параметру.
soon
19.09.2012, 14:43
  #19

Не по теме:


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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2012, 14:43     Шаблоны template с ограниченными параметрами
Еще ссылки по теме:

Ошибка компиляции: template-id does not match any template declaration C++
Что за пустые шаблоны template <> struct/inline? C++
'MyQueue' : use of class template requires template argument list C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2012, 14:43     Шаблоны template с ограниченными параметрами #20
soon, Нет. Юра предлагал два класса. Различных. О специализации Юра не говорил.
Yandex
Объявления
19.09.2012, 14:43     Шаблоны template с ограниченными параметрами
Ответ Создать тему
Опции темы

Текущее время: 05:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru