Форум программистов, компьютерный форум 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 и всё, другие нельзя).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
19.09.2012, 14:46     Шаблоны template с ограниченными параметрами
  #21

Не по теме:

А. Ну да. John Prick, извините

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
19.09.2012, 14:48
  #22

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Не вопрос надо так надо - выше простой пример. Я зуб за 100 даю задание ТС решается куда более проще если узнать зачем оно надо, буз всяких шаблонов и прочего высокоуровневого кода, просто люди часто сами себе проблем придумают а потом решают...
Это проблема более высокого уровня. Нельзя и на ёлку влезть (статически гарантируемый тайпсейф) и жопу не ободрать (вагон кода сверху для описания типов). Особенно в Си++, где типы описывать можно только шаблонной магией и нет удобного способа описать тип "это может быть int, double или bool".

CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
19.09.2012, 14:48     Шаблоны template с ограниченными параметрами #23
FireNovel, грамотное решение тебе предложил коллега ForEveR. О списках типов и static_assert хорошо написано у Александреску в его "Современном проектировании на C++" (книга существует в электронном виде в Сети, гугл в помощь).
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2012, 14:48     Шаблоны template с ограниченными параметрами #24
Так! Меня начинает напрягать глупость некоторых, вот код который позволяет добавлять только int и double что с ним делать пусть ТС решает, единственное ему вместо
C++
1
typeid(val) == typeid(double)
следет записать
C++
1
typeid(val) == typeid(MyClass1)
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
#include <vector>
#include <iostream>
using namespace std;
 
template <class T>
class GybridContainer
{
private:
    vector<T> vec;
    //typedef vector<T>::iterator iterator;
public:
    GybridContainer(){vec.clear();}
    void push_back(T val)
    {
        if
        (
            typeid(val) == typeid(double)
            ||
            typeid(val) == typeid(int)
        )
        {
            cout<<val<<" is added"<<endl;
            vec.push_back(val);
        }
        else
            cout<<val<<" not added"<<endl;
    }
    T at(int i)
    {
        return vec.at(i);
    }
};
 
int main()
{
    int i;
    GybridContainer<int> pInt;
    for(i = 0; i < 20; i++)
        pInt.push_back(i);
    GybridContainer<double> pDbl;
    for(i = 0; i < 20; i++)
        pDbl.push_back(1.0*i);
    GybridContainer<char> pChr;
    for(i = 0; i < 20; i++)
        pChr.push_back((char)(i + 48));
    return 0;
}
Отработка здесь http://codepad.org/PJKqWgze
и под катом
Отработка
0 is added
1 is added
2 is added
3 is added
4 is added
5 is added
6 is added
7 is added
8 is added
9 is added
10 is added
11 is added
12 is added
13 is added
14 is added
15 is added
16 is added
17 is added
18 is added
19 is added
0 is added
1 is added
2 is added
3 is added
4 is added
5 is added
6 is added
7 is added
8 is added
9 is added
10 is added
11 is added
12 is added
13 is added
14 is added
15 is added
16 is added
17 is added
18 is added
19 is added
0 not added
1 not added
2 not added
3 not added
4 not added
5 not added
6 not added
7 not added
8 not added
9 not added
: not added
; not added
< not added
= not added
> not added
? not added
@ not added
A not added
B not added
C not added
Press any key to continue


PS:Кто не умеет писать просто - тот не умеет писать вооюще, Удачи!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2012, 14:50     Шаблоны template с ограниченными параметрами #25
-=ЮрА=-, И зачем нам проверка в runtime?)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2012, 14:50     Шаблоны template с ограниченными параметрами #26
Юра, это динамическая проверка. А надо именно статически, в этом и вся соль.


Цитата Сообщение от ForEveR Посмотреть сообщение
soon, Нет. Юра предлагал два класса. Различных. О специализации Юра не говорил.
А какая разница? Методы всё равно придётся дублировать, они ж не наследуются специализациями.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2012, 14:53     Шаблоны template с ограниченными параметрами #27
~OhMyGodSoLong~, Так-то да. Но будет одно имя для типа. Специализация столь же тяжела, сколь и описание типов с разными именами (по кол-ву кода).
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2012, 14:56     Шаблоны template с ограниченными параметрами #28
Цитата Сообщение от ForEveR Посмотреть сообщение
-=ЮрА=-, И зачем нам проверка в runtime?)
- а зачем нам городить огород кода, как ты советуешь, м?(по длинне думаю выйдет не короче, а наверное и длинне чем моя простая реализация) ТС-у осталось лишь прописать все методы std::vector (нужные для его алгоритма, даже не все) в GybridContainer и юзать, вместо занятий бог весть чем...

Не по теме:

А самое смешное, автор темы явно указал рамки в которых необходимо решение

Цитата Сообщение от FireNovel Посмотреть сообщение
Блин. Я в VS2008 пишу
. Ну вот у меня решение готово, а у тебя каким оно будет?

John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.09.2012, 14:58     Шаблоны template с ограниченными параметрами #29
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Методы всё равно придётся дублировать, они ж не наследуются специализациями.
Ну кстати, можно ведь контейнер спрятать в отдельный класс.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class T>
struct ContainerWrapper;
 
template <>
struct ContainerWrapper<int>
{
   typedef std::vector<int> TContainer;
};
 
template <>
struct ContainerWrapper<MyClass>
{
   typedef std::vector<MyClass> TContainer;
};
 
template <class T>
class MyVec
{
   ContainerWrapper<T>::TContainer;
};
Тогда код MyVec дублировать не придётся, а если использовать MyVec с каким-либо типом, отличным от int и MyClass, то отвалится на компиляции.
Решение, конечно, кривое, но уже не так плохо, как дублирование целого класса.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2012, 14:59     Шаблоны template с ограниченными параметрами #30
-=ЮрА=-, Использую стороннюю библиотеку (буст, локи).) Можно и самому написать, но это лень.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2012, 15:00     Шаблоны template с ограниченными параметрами #31
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а зачем нам городить огород кода, как ты советуешь, м?(по длинне думаю выйдет не короче, а наверное и длинне чем моя простая реализация) ТС-у осталось лишь прописать все методы std::vector (нужные для его алгоритма, даже не все) в GybridContainer и юзать, вместо занятий бог весть чем...
static_assert без нормального вывода сообщения об ошибке, но успешно не дающий скомпилить программу, пишется на коленке в три строки, если уж так неохота тащить буст.
-=ЮрА=-
19.09.2012, 15:02
  #32

Не по теме:

~OhMyGodSoLong~, ну возьми напиши автор темы тебе будет благодарен. Пока решения кроме своего из поста 24 я так и не увиделМеньше слов, больше действий

OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2012, 15:11     Шаблоны template с ограниченными параметрами #33
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

~OhMyGodSoLong~, ну возьми напиши автор темы тебе будет благодарен. Пока решения кроме своего из поста 24 я так и не увиделМеньше слов, больше действий

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <bool clause> struct static_assert__;
template <> struct static_assert__<true> {};
#define STATIC_ASSERT(clause) enum {___ = sizeof(static_assert__<(bool)(clause)>)}
 
class Foo {
  STATIC_ASSERT(1 == 2);
};
 
int foo()
{
  STATIC_ASSERT(1 == 2);
}
 
int main()
{
  STATIC_ASSERT(1 == 2);
}
Недостатки: нехорошее сообщение об ошибке и только одна штука на локальную область видимости (плюс засирание этой области идентификатором ___).

Штуку type_equals<T1, T2>, которая true для равных и false для различных типов уж сами напишете.
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2012, 15:17     Шаблоны template с ограниченными параметрами #34

Не по теме:

~OhMyGodSoLong~, ты уж прости "меня тупого", но каким гаком это всё относится к коду автора темы?Я пока ничего из твоего кода не уловил...
Где тут проверка на MyClass1 int - х*рня какая-то прости за выражение...
Вобщем ~OhMyGodSoLong~, я хочу увидеть готовый алгоритм с длинной кода хотя бы меньше моего, пока я ничего не вижу



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

Не по теме:

Ты написал - "делается в 3 строки". Сейчас уже вижу 20-ть и к решению задания даже ещё не подобрались, одну штуку написать в ней другую, как-то не отвечаешь за свои слова...
Вобщем покажи то что можно хотябы проанализировать и сравнить

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2012, 15:21     Шаблоны template с ограниченными параметрами #35
-=ЮрА=-, У него static_assert написан именно в 3 строки. Остальное тесты.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2012, 15:23     Шаблоны template с ограниченными параметрами #36
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я обещал технически работающий static_assert в три строки — я его показал.

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
template <bool clause> struct static_assert__;
template <> struct static_assert__<true> {};
#define STATIC_ASSERT(clause) enum {___ = sizeof(static_assert__<(bool)(clause)>)}
 
template <typename T1, typename T2>
struct type_equals__ {
  static const bool value = false;
};
 
template <typename T>
struct type_equals__<T, T> {
  static const bool value = true;
};
 
#define TYPE_EQUALS(T1, T2) (type_equals__<T1, T2>::value)
 
template <class T>
class Foo {
  STATIC_ASSERT(TYPE_EQUALS(T, int) || TYPE_EQUALS(T, double));
  
  // ...
};
 
int main()
{
  Foo<int> ();
  Foo<double> ();
  Foo<char> ();
}
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.09.2012, 15:25     Шаблоны template с ограниченными параметрами #37
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Пока решения кроме своего из поста 24 я так и не увидел
Ну если не смотреть, то и не увидишь.
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
19.09.2012, 15:39  [ТС]     Шаблоны template с ограниченными параметрами #38
Я смотрю тут такая дискуссия... Мне прям стыдно влезать с вопросом

Может я некорректно поставил предыдущий вопрос, поэтому перефразирую.
Необходимо наличие определенного метода в допустимых типах
например допустимые типы: Type1, Type2, Type3 ... (сразу уточню, что типы не стандартные)
Они должны содержать метод например Calc(). пока, что реализовал как писал ранее(с template). и все работает.
Но хотелось защитить от недопустимых типов, так как планирую расширять количество классов Type.

Может быть можно с помощью наследования решить
для Type Взять родителем абстрактный класс Base, но пока не придумал как.
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
class Type1 {   
    ...
public:
    double Calc() {}
};
 
class Type2{
    ...
public:
    double Calc() {}
};
 
 
class Base {
public:
    virtual double Calc() = 0;
};
 
template <class T>
class MyVec {
    std::vector<T> m_vec;
    ...
    double AllCalc(){
        for(int i = 0; i < m_vec.size(); ++i)
            m_vec[i].Calc(); // хотелось бы чтобы MyVec работал только с теми типами
                         // в которых есть метод Calc()
    }
};
~OhMyGodSoLong~, Спасибо надо будет изучить.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.09.2012, 15:45     Шаблоны template с ограниченными параметрами #39
Цитата Сообщение от FireNovel Посмотреть сообщение
// хотелось бы чтобы MyVec работал только с теми типами
// в которых есть метод Calc()
Ну так он и будет только с ними работать. Со всеми другими будет выдаваться ошибка компиляции, говорящая о том, что метода Calc в классе, переданном в MyVec, нет. И ничего лишнего городить не надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2012, 15:45     Шаблоны template с ограниченными параметрами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 15:45     Шаблоны template с ограниченными параметрами #40
как уже писали, при наличии статик ассерта и другой оснастки, написать такое достаточно просто.
за деталями обнаружения метода отсылаю к саттеру. у него есть главы, посвященные этому.

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
template <typename T1, typename T2>
struct is_same
{
  static const bool result = false;
};
 
template <typename T>
struct is_same<T, T>
{
  static const bool result = true;
};
 
 
template <typename T>
class Class
{
  template <typename U>
  struct check_method_existance
  {
    static bool result = true; // вот тут нужно имплементить. посмотреть можно у саттера или александревску.
  };
 
  template <typename U>
  struct validate_type
  {
    // набор проверок для типа сливается в одну переменную
    static const bool result = is_same<U, int>::result
                            || is_same<U, double>::result
                            || check_method_existance<U>::result
                            ;
  };
 
  STATIC_ASSERT(validate_type<T>::result);
 
public:
  Class()
  {
  }
};
Yandex
Объявления
19.09.2012, 15:45     Шаблоны template с ограниченными параметрами
Ответ Создать тему
Опции темы

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