6 / 6 / 1
Регистрация: 01.12.2010
Сообщений: 105
1

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

14.03.2012, 14:39. Показов 2003. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2012, 14:39
Ответы с готовыми решениями:

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

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

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

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

14
228 / 50 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
14.03.2012, 16:25 2
скорее нет. что то можно вывенуться через функции попробовать
0
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
15.03.2012, 12:38 3
Цитата Сообщение от cyberguz Посмотреть сообщение
template <class T, T obj>
Т.е. тебя не смущает, что в данном шаблоне T может быть только целым числом? Тогда пиши сразу "int obj" и не печалься.
0
6 / 6 / 1
Регистрация: 01.12.2010
Сообщений: 105
15.03.2012, 17:08  [ТС] 4
T может быть только целым числом
?? чё эта?
0
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
15.03.2012, 17:20 5
Цитата Сообщение от cyberguz Посмотреть сообщение
чё эта?
Как бы это прописано в стандарте...
Цитата Сообщение от Deviaphan Посмотреть сообщение
в данном шаблоне
Цитата Сообщение от Deviaphan Посмотреть сообщение
template <class T, T obj>
1
6 / 6 / 1
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
16.03.2012, 06:34 7
Может ты лучше напишешь, чего хочешь получить? Вопрос в посте №1 никак не связан с №6.
Сейчас ты получил конструктор преобразования, принимающий хоть что в качестве аргумента. В данном случае это указатель на функцию, но точно так же можно передать всё что угодно. Т.е. использовать его нельзя.(
Напиши, что именно ты хочешь.
1
4 / 4 / 2
Регистрация: 05.05.2012
Сообщений: 201
Записей в блоге: 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
бжни
2473 / 1684 / 135
Регистрация: 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
4 / 4 / 2
Регистрация: 05.05.2012
Сообщений: 201
Записей в блоге: 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
бжни
2473 / 1684 / 135
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.05.2012, 20:04 12
Цитата Сообщение от Borkot Посмотреть сообщение
T res = T();//Тут результат присваивается функции T()?Можнопоподробнее?
Инициализация res конструктором по умолчанию. Аналогично записи T res();

Цитата Сообщение от Borkot Посмотреть сообщение
arr адреса с кол вом элементов N
Это статический массив размерностью N. Функция работает только со статическими массивами, т.к. тип (размерность массива) должны быть известны на этапе компиляции.
1
4 / 4 / 2
Регистрация: 05.05.2012
Сообщений: 201
Записей в блоге: 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
бжни
2473 / 1684 / 135
Регистрация: 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
4 / 4 / 2
Регистрация: 05.05.2012
Сообщений: 201
Записей в блоге: 1
08.05.2012, 12:32 15
Спасибо Огромное.Звеняйте нас чайнкиов зеленых...Но без ваших консультаций никак...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2012, 12:32
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru