Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
6 / 6 / 1
Регистрация: 01.12.2010
Сообщений: 105

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

14.03.2012, 14:39. Показов 2529. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.03.2012, 14:39
Ответы с готовыми решениями:

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

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

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

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

Шаблоны функций можно использовать без указания типа за счёт перегрузки.
Конечно не то, что хотелось, но тоже ничего, например:
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
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
16.03.2012, 06:34
Может ты лучше напишешь, чего хочешь получить? Вопрос в посте №1 никак не связан с №6.
Сейчас ты получил конструктор преобразования, принимающий хоть что в качестве аргумента. В данном случае это указатель на функцию, но точно так же можно передать всё что угодно. Т.е. использовать его нельзя.(
Напиши, что именно ты хочешь.
1
 Аватар для Borkot
4 / 4 / 2
Регистрация: 05.05.2012
Сообщений: 201
Записей в блоге: 1
06.05.2012, 13:31
Цитата Сообщение от 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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.05.2012, 14:01
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 / 2
Регистрация: 05.05.2012
Сообщений: 201
Записей в блоге: 1
06.05.2012, 17:11
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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.05.2012, 09:54
Цитата Сообщение от Borkot Посмотреть сообщение
T (&arr)[N]
ссылка на массив
Если передавать просто T arr[N] - не происходит дедукция типов
Цитата Сообщение от Borkot Посмотреть сообщение
T res = T()
это просто инициализация значения
для int, double etc формально тоже есть конструкторы
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.05.2012, 20:04
Цитата Сообщение от Borkot Посмотреть сообщение
T res = T();//Тут результат присваивается функции T()?Можнопоподробнее?
Инициализация res конструктором по умолчанию. Аналогично записи T res();

Цитата Сообщение от Borkot Посмотреть сообщение
arr адреса с кол вом элементов N
Это статический массив размерностью N. Функция работает только со статическими массивами, т.к. тип (размерность массива) должны быть известны на этапе компиляции.
1
 Аватар для Borkot
4 / 4 / 2
Регистрация: 05.05.2012
Сообщений: 201
Записей в блоге: 1
08.05.2012, 11:50
Спасибо! Я такого не знал,что можно T rez=T();
А вот еще код.Гляньте одним глазком.Что не так.Задача такая была написать перегруженные шаблоны,и решить уравнения
Code
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
#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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.05.2012, 12:00
тут вопрос не в шаблонах, компилятор же явно пишет
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 / 2
Регистрация: 05.05.2012
Сообщений: 201
Записей в блоге: 1
08.05.2012, 12:32
Спасибо Огромное.Звеняйте нас чайнкиов зеленых...Но без ваших консультаций никак...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.05.2012, 12:32
Помогаю со студенческими работами здесь

Аргументы шаблона по умолчанию можно использовать только в шаблоне класса
Помогите разобраться. В чем проблема. VS 2012, Код был написан под VS 2015. В 15 студии компилится нормально. Мне нужно сделать так...

Как можно задать требования к параметрам типа шаблона?
#include &lt;iostream&gt; #include &lt;type_traits&gt; template &lt;class T, bool required&gt; struct examine_type { constexpr examine_type() {...

Error C4519: аргументы шаблона по умолчанию можно использовать только в шаблоне класса
void sort_when_two_threads(Iterator first, Iterator last, Compare comp = std::less&lt;typename std::iterator_traits&lt;Iterator&gt;::value_type&gt;()) ...

Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа
Доброго времени суток, пишу класс содержащий несколько std::set от разных типов, нужно сделать метод возвращающий указатель на нужное...

Можно ли использовать cin.getline для указателя типа char*
Вот к примеру код он работает, но при отладке Ошибка доступа. #include &lt;iostream&gt; using namespace std; struct EXAMPLE{char* pName;...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru