Частичная специлизация
От: Sergei  
Дата: 05.10.05 10:29
Оценка:
Есть функция

template<class T1.class T2>
T2 func(const T2& val)
{
 cout<<val;
}


Хочется сделать частичную специализацию, к примеру

template <>
double func<double,class T2>func(const T2& val)
{
 ....
 string str=func<string,T2>(val);
}



Но выдается ошибка при компиляции
'operator<<' not implemented in type 'std::ostream' for arguments of type 'T2'
Компилятор bcc 5.5.1
То есть он, скорей всего, определяет что T2 это тип конкретного объекта, а не параметер шаблона
Как исправить?
Может есть обходные пути?
Re: Частичная специлизация
От: Sergey Россия  
Дата: 05.10.05 10:39
Оценка: 2 (1)
> Есть функция
>
>
> template<class T1.class T2>
> T2 func(const T2& val)
> {
> cout<<val;
> }
>

>
> Хочется сделать частичную специализацию, к примеру

Частичной специализации функций не бывает. Но поскольку есть перегрузка, то
можно написать:
template<class T> double func(const T& val) {...}
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Частичная специлизация
От: Шебеко Евгений  
Дата: 05.10.05 10:43
Оценка: 2 (1)
Боюсь соврать, но частичной специал. для функций нет.
Пользуйтесь перегрузкой.

S>Есть функция


S>
S>template<class T1,class T2>
S>void ifunc(const T1& val,T2& ret)
S>{
S>...
S>}

S>template <class T2>
S>void ifunc(const double& val,T2& ret)
S>{
S>...
S>}
S>
S>template<class T1,class T2>
S> T1 func(const T2& val)
S> {
S>   T1 ret;
S>   return ifunc(val,ret);
S> }
S>
Re[2]: Частичная специлизация
От: Sergei  
Дата: 05.10.05 11:07
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Частичной специализации функций не бывает. Но поскольку есть перегрузка, то

S>можно написать:
S>
S>template<class T> double func(const T& val) {...}
S>


Большое спасибо, как же я раньше не догадался...

Еще вопрос, можно ли сделать, чтобы аргументы функции

template<class T1.class T2>
T2 func(const T2& val)

Выводились сами. Чтобы можно было записать

int func<>(string("1"));
Re[3]: Частичная специлизация
От: jazzer Россия Skype: enerjazzer
Дата: 05.10.05 11:19
Оценка: +1
Здравствуйте, Sergei, Вы писали:

S>Еще вопрос, можно ли сделать, чтобы аргументы функции


S>
S>template<class T1.class T2>
S>T2 func(const T2& val)
S>

S>Выводились сами. Чтобы можно было записать

S>
S>int func<>(string("1"));
S>


И чему в данном случае должен быть равен T1?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Частичная специлизация
От: Sergei  
Дата: 05.10.05 11:34
Оценка: :)))
Здравствуйте, jazzer, Вы писали:

S>>
S>>int func<>(string("1"));
S>>


J>И чему в данном случае должен быть равен T1?


int
Re[5]: Частичная специлизация
От: Sergey Россия  
Дата: 05.10.05 12:02
Оценка: 2 (1)
> S>>
> S>>int func<>(string("1"));
> S>>

>
> J>И чему в данном случае должен быть равен T1?
>
>
> int
>


Если я все правильно понял, то в исходном примере была опечатка и вместо
template<class T1.class T2>
T2 func(const T2& val)

должно было быть
template<class T1.class T2>
T1 func(const T2& val)


Нет, так не выйдет. Но можно писать
int x = func<int>(string("1"));

Параметр T1 придется задать руками, параметр T2 будет выведен из аргументов.
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Частичная специлизация
От: CrystaX Россия https://crystax.me/
Дата: 05.10.05 12:11
Оценка: 3 (2)
Здравствуйте, Sergey, Вы писали:


S>Нет, так не выйдет. Но можно писать

S>
S>int x = func<int>(string("1"));
S>

S>Параметр T1 придется задать руками, параметр T2 будет выведен из аргументов.

А еще можно так (авторство принадлжит Шахтеру):
template <typename T1, typename T2>
T1 func_impl(T2 const &)
{
    return T1();
}

template <typename T2>
class func_t
{
public:
    func_t(T2 const &val) :v(val) {}
    
    template <typename T1>
    operator T1 () {return func_impl<T1>(v);}
    
private:
    T2 v;
};

template <typename T>
func_t<T> func(T const &val) {return func_t<T>(val);}

int main()
{
    // Использование:
    int x = func(string("1"));

    return 0;
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[6]: Частичная специлизация
От: Глеб Алексеев  
Дата: 05.10.05 12:12
Оценка: 3 (1)
Здравствуйте, Sergey, Вы писали:

S>Параметр T1 придется задать руками, параметр T2 будет выведен из аргументов.

Ты прав, но при желании можно извратиться (если предположить, что подопытная func — это boost::lexical_cast):
#include <string>
#include <boost/lexical_cast.hpp>

template <class T>
struct caster {
  T value;
  explicit caster(T arg) : value(arg) {
  }
  template <class U>
  operator U()const {
    return boost::lexical_cast<U>(value);
  }
};

template <class T>
caster<T> cast(T value) {
  return caster<T>(value);
}

#include <iostream>
int main() {
  int i = cast("35");
  float f = cast("12.3");
  std::cout << i << std::endl << f;
  return 0;
}

(с) Идея нагло сперта у Шахтера, искать лень.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Частичная специлизация
От: CrystaX Россия https://crystax.me/
Дата: 05.10.05 12:42
Оценка: 1 (1)
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>(с) Идея нагло сперта у Шахтера, искать лень.


здесь
Автор: Шахтер
Дата: 20.08.05
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: Частичная специлизация
От: Глеб Алексеев  
Дата: 05.10.05 12:45
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>здесь
Автор: Шахтер
Дата: 20.08.05

На время сообщения посмотри. Мы писали одновременно .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Частичная специлизация
От: CrystaX Россия https://crystax.me/
Дата: 05.10.05 12:47
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, CrystaX, Вы писали:


CX>>здесь
Автор: Шахтер
Дата: 20.08.05

ГА>На время сообщения посмотри. Мы писали одновременно .

Я не на свое сообщение линк дал, а на то, которое тебе было "искать лень".
Первоисточник, так сказать.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[10]: Частичная специлизация
От: Глеб Алексеев  
Дата: 05.10.05 12:51
Оценка: :)
Здравствуйте, CrystaX, Вы писали:

CX>Я не на свое сообщение линк дал, а на то, которое тебе было "искать лень".

CX>Первоисточник, так сказать.
Понял уже , удалить не успел. Иногда и ссылки открывать лень (что характерно, при этом не лень писать ответы, каюсь ).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Частичная специлизация
От: Sergei  
Дата: 05.10.05 13:08
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, Sergey, Вы писали:


S>>Параметр T1 придется задать руками, параметр T2 будет выведен из аргументов.

ГА>Ты прав, но при желании можно извратиться (если предположить, что подопытная func — это boost::lexical_cast):

Вы правы это lexical_cast, правда только не из boost, а от Герба Саттера-а.(откуда он её взял интересно?)

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

double f=func<>(string("1.2")); //Ok используется перегрузка с одним параметром
string str=func<>(string(1.2)) //error используется шаблон с двумя параметрами.
Re[8]: Частичная специлизация
От: CrystaX Россия https://crystax.me/
Дата: 05.10.05 13:19
Оценка: 2 (1)
Здравствуйте, Sergei, Вы писали:

S>Вы правы это lexical_cast, правда только не из boost, а от Герба Саттера-а.(откуда он её взял интересно?)


Из boost. Почитай внимательно, он об этом пишет в книге.

S>Только вопрос, почему же компилятор для одного шаблонного параметра может вывести аргумент, а для двух нет?


S>
S>double f=func<>(string("1.2")); //Ok используется перегрузка с одним параметром
S>string str=func<>(string(1.2)) //error используется шаблон с двумя параметрами.
S>


Компилятор может вывести тип только из типов аргументов, но не из типа объекта, которому присваивается результат.
В твоем случае типом аргумента является T2, а T1 — тип возвращаемого значения, поэтому T1 выводится, а T2 нет. Вот, кстати, код для пояснения:
void foo(int );
void foo(double );

template <typename T1, typename T2>
T1 func(T2 const &val);

int x = 1;
foo(func(x)); // Что здесь вызывать? foo(int ) или foo(double)?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[9]: Частичная специлизация
От: Sergei  
Дата: 05.10.05 13:44
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Здравствуйте, Sergei, Вы писали:


S>>Вы правы это lexical_cast, правда только не из boost, а от Герба Саттера-а.(откуда он её взял интересно?)


CX>Из boost. Почитай внимательно, он об этом пишет в книге.


Точно.

Спасибо всем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.