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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
cyberguz
6 / 6 / 0
Регистрация: 01.12.2010
Сообщений: 105
#1

Можно ли использовать параметр шаблона без типа? - C++

14.03.2012, 14:39. Просмотров 1354. Ответов 14
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
#define TV(OBJ) typeof(OBJ), OBJ
 
template<class T, T obj> class A {/*...*/};
 
int f (int);
 
A<TV(f)> a;
Можно ли сделать такое-же, но без препроцессора?

Можно ли сделать чтобы работало как-то так:
C++
1
2
3
4
template <class T, T obj> class Base {/*...*/};
template <OBJ> class A : public Base <typeof(OBJ), OBJ> {};
int f (int);
A<f> a;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2012, 14:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли использовать параметр шаблона без типа? (C++):

Можно ли заменить обращение к Union без указания типа переменной? - C++
Можно ли заменить обращение к Union без указания типа переменной?(т.е. без .i .f .str, а просто к &quot;data&quot;) #include &lt;stdio.h&gt; #include...

Фрагмент кода от типа шаблона - C++ Builder
В С++ есть шаблонные классы. Хочется сделать так, что бы в зависимости от типа T (см. пример) выполнялись разные фрагменты кода? Я...

Строки из Memo использовать как параметр rgb - C++ Builder
Здравствуйте, у меня возникла проблема с функцией RGB и компонентом мемо Подскажите как сделать так что бы строка из мемо была...

можно сделать так чтоб можно было использовать ifstream? - C++ Builder
void __fastcall TForm1::Button1Click(TObject *Sender) можно как то сделать так чтоб обработке кнопки можно было использовать ifstream...

Как правильно перегрузить оператор присвоения под параметр типа AnsiString - C++ Builder
Вот делаю домашку, и проблема, моя строка ждет интов, а не самих строк AnsiString, Builder 6 стоит Вот сами класы: class CMas {...

Можно ли в WndProc передать свой параметр? - C++ WinAPI
Тоесть, в оконную процедуру прилетаю всякие сообщения типа WM_LBUTTONDOWN, WM_KEYDOWN и тд, мне хотелось бы, чтоб в этой глобальной функции...

14
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
14.03.2012, 16:25 #2
скорее нет. что то можно вывенуться через функции попробовать
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.03.2012, 12:38 #3
Цитата Сообщение от cyberguz Посмотреть сообщение
template <class T, T obj>
Т.е. тебя не смущает, что в данном шаблоне T может быть только целым числом? Тогда пиши сразу "int obj" и не печалься.
0
cyberguz
6 / 6 / 0
Регистрация: 01.12.2010
Сообщений: 105
15.03.2012, 17:08  [ТС] #4
T может быть только целым числом
?? чё эта?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.03.2012, 17:20 #5
Цитата Сообщение от cyberguz Посмотреть сообщение
чё эта?
Как бы это прописано в стандарте...
Цитата Сообщение от Deviaphan Посмотреть сообщение
в данном шаблоне
Цитата Сообщение от Deviaphan Посмотреть сообщение
template <class T, T obj>
1
cyberguz
6 / 6 / 0
Регистрация: 01.12.2010
Сообщений: 105
15.03.2012, 22:09  [ТС] #6
Нашёл

Шаблоны функций можно использовать без указания типа за счёт перегрузки.
Конечно не то, что хотелось, но тоже ничего, например:
C++
1
2
3
4
5
6
7
class A
{
public:
    template <typename T> A (T& t) {}
};
int f (int);
A a = A(f);
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.03.2012, 06:34 #7
Может ты лучше напишешь, чего хочешь получить? Вопрос в посте №1 никак не связан с №6.
Сейчас ты получил конструктор преобразования, принимающий хоть что в качестве аргумента. В данном случае это указатель на функцию, но точно так же можно передать всё что угодно. Т.е. использовать его нельзя.(
Напиши, что именно ты хочешь.
1
Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 184
Записей в блоге: 1
06.05.2012, 13:31 #8
Цитата Сообщение от cyberguz Посмотреть сообщение
C++
1
2
3
4
5
6
7
class A
{
public:
    template <typename T> A (T& t) {}
};
int f (int);
A a = A(f);
А шаблоны обязательно так объявлять,или можно
C++
1
2
3
template <typename T>
void fun(T &a,T &b)
{}
Добавлено через 44 минуты
Задача такая Написать шаблон функции для поиска среднего арифметического значений массива
Разбираюсь с шаблонами функций,но что-то делаю не так не могу понять что?
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
#include<iostream>
using namespace std;
int S4isl();
int const a=5;
double ar1[a]={2.2,0.5,7.5,6.8,9.6};
int ar[a];
template <typename T>
SRAref(T ar[])
{   int S=0,S1=0,i;
    for(i=0;i<a;i++)
    {
        
        S+=ar[i];
    }
    S1=S/i;
    cout<<S1<<endl;
    return S1;
}
void main()
{
    double SRAref(ar1[a]);
    S4isl();
    int SRAref(ar[a]);
    
}
int S4isl()
{
    for(int i=0;i<a;i++)
    {
        ar[i]=i;
    }
    return ar[a];
}
Скажите что здесь не правильно.Спасибо заранее.

Добавлено через 5 минут
Всё разобрался. ссылка для тех кому может пригодится: http://ru.wikipedia.org/wiki/Шаблоны_C%2B%2B Вопрос снят, но если примерчик выложите буду благодарен.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.05.2012, 14:01 #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
template <typename T, size_t N>
T get_avg (T (&arr)[N]) {
  T res = T();
  for (size_t i = 0 ; i < N ; ++i) {
    res += arr[i];
  }
  return res / N;
}
 
int main() {
  int arr [] = { 1, 2, 3, 4, 5 };
  std::cout << get_avg(arr) << std::endl;
}
1
Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 184
Записей в блоге: 1
06.05.2012, 17:11 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T, size_t N>
T get_avg (T (&arr)[N]) {//T get_avg -я так понимаю это функция arr адреса  с кол вом элементов N
  T res = T();//Тут результат присваивается функции T()?Можнопоподробнее?
  for (size_t i = 0 ; i < N ; ++i) {
    res += arr[i];
  }
  return res / N;
}
 
int main() {
  int arr [] = { 1, 2, 3, 4, 5 };
  std::cout << get_avg(arr) << std::endl;
}
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
07.05.2012, 09:54 #11
Цитата Сообщение от Borkot Посмотреть сообщение
T (&arr)[N]
ссылка на массив
Если передавать просто T arr[N] - не происходит дедукция типов
Цитата Сообщение от Borkot Посмотреть сообщение
T res = T()
это просто инициализация значения
для int, double etc формально тоже есть конструкторы
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.05.2012, 20:04 #12
Цитата Сообщение от Borkot Посмотреть сообщение
T res = T();//Тут результат присваивается функции T()?Можнопоподробнее?
Инициализация res конструктором по умолчанию. Аналогично записи T res();

Цитата Сообщение от Borkot Посмотреть сообщение
arr адреса с кол вом элементов N
Это статический массив размерностью N. Функция работает только со статическими массивами, т.к. тип (размерность массива) должны быть известны на этапе компиляции.
1
Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 184
Записей в блоге: 1
08.05.2012, 11:50 #13
Спасибо! Я такого не знал,что можно T rez=T();
А вот еще код.Гляньте одним глазком.Что не так.Задача такая была написать перегруженные шаблоны,и решить уравнения
Код
#include<iostream>
#include<math.h>
using namespace std;
template <typename T>T Fun(T a,T b,T c);
template <typename T>T Fun(T a,T b);
template <typename T>T Fun(T a,T b)
{	T b=T();T a=T();T x=T();
	x=((-b)/a);
	cout<<"x="<<x<<endl;
}
template <typename T>T Fun(T a,T b,T c)
{
  T a=T();T b=T();T c=T();T x=T();T x1=T();
  if(a==0)
  {cout<<"Error square root x, x1 not found";}
  else
  {
  x=(-b+(sqrt((b*b)-(4*a*c))))/(2*a);
  x1=(-b-(sqrt((b*b)-(4*a*c))))/(2*a);
  cout<<x<<'\n'<<x1;
  }
}
void main(void)
{	int a,b,c;
cin>>a>>b;
	Fun(a,b);
	cin>>a>>b>>c;
	Fun(a,b,c);
}
Ругается на переопределение в шаблоне a,b,c, и sqrt() сообщает двусмысленное название перегруженой функции
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.05.2012, 12:00 #14
тут вопрос не в шаблонах, компилятор же явно пишет
declaration of 'T a' shadows a parameter
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
#include<iostream>
#include<cmath>
 
using namespace std;
 
template <typename T> T Fun(T a,T b,T c);
template <typename T> T Fun(T a,T b);
 
template <typename T>T Fun(T a,T b)
{   
    T x=T();
    x=((-b)/a);
    cout<<"x="<<x<<endl;
}
 
template <typename T>T Fun(T a,T b,T c)
{
  T x=T();T x1=T();
  if(a==0)
  {cout<<"Error square root x, x1 not found";}
  else
  {
  x=(-b+(sqrt((b*b)-(4*a*c))))/(2*a);
  x1=(-b-(sqrt((b*b)-(4*a*c))))/(2*a);
  cout<<x<<'\n'<<x1;
  }
}
 
int main()
{   int a,b,c;
    cin>>a>>b;
    Fun(a,b);
    cin>>a>>b>>c;
    Fun(a,b,c);
}
1
Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 184
Записей в блоге: 1
08.05.2012, 12:32 #15
Спасибо Огромное.Звеняйте нас чайнкиов зеленых...Но без ваших консультаций никак...
0
08.05.2012, 12:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2012, 12:32
Привет! Вот еще темы с ответами:

Как ограничить параметр типа шаблона только числовыми типами данных? - C++
Собствено, сабж. Ключевое для поиска слово хотябы.

Как можно изменить параметр шаблона (template)? - C++
есть такие классы: class abstract { public: virtual int method() = 0; // Допустим }; class A: public abstract {

Как использовать в запросе параметр типа int - Программирование Android
Доброго времени суток. Требуется выполнить SQL-запрос, используя параметр типа int. Листинг: String selection=&quot;SELECT kkal FROM...

Как можно использовать фактический параметр у метода? - C++
ситуация примерно такая: class A { int a; public : int get_a() { return a; } };


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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