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

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

14.03.2012, 14:39. Показов 2520. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru