LINUX.ORG.RU

Полная специализация шаблонной функции шаблонным классом


0

0

Покажите пример, а?
Т.е. есть шаблонный класс вида

template<typename T> class A {
int f1;
int f2;
T f3;
}
;

и шаблонная функция с различными специализациями:
template<typename T> size_t func(T v);

// специализация для примитивных типов
template<typename T> size_t func(T v){
  return sizeof(v);
}

// специализация для комплексного типа
template<> size_t func<std::string>(std::string v){
  return v.length()+1;
}

а как написать специализацию для шаблонного класса A?
anonymous
Ответ на: комментарий от anonymous

> ага, делать больше нехуй, как переписывать рабочий код на хаскеле.

После переписывания на хаскель станет понятно, что оригинал на самом деле работал неверно, некорректно обрабатывал те и те данные и вообще содержал в себе 1000 и 1 баг :)

fmj
()
Ответ на: комментарий от fmj

ну для того чтобы это понять не нужно ничего переписывать на хаскеле. то что где-то что-то не работает это я и так знаю ;)

anonymous
()
Ответ на: комментарий от grob

так я пробовал, оно собирается но не работает так как я расчитывал :(. т.е. при вызове func(A<int>(...)) вызывается не эта специализация, а та, которая была описана выше, т.е. template <tempname T> size_t func(T v){ return sizeof(v); } что ж, буду учить матчасть.

anonymous
()
Ответ на: комментарий от anonymous

"Шаблоны С++" Вандервуда должны помочь, или Александреску

alex_custov ★★★★★
()
Ответ на: комментарий от anonymous

Уверен?

#include <string>
#include <iostream>

using namespace std;

template<typename T> 
class A {
public:
	T t;
	A(T t);
};

template<typename T>
A<T>::A(T t) : t(t) {}

template <typename T> 
void foo(T t) {
	cout << "general: " << t << endl;
}

template<> 
void foo<std::string>(std::string v) {
	cout << "string: " << v << endl;
}

template <typename T>
void foo(A<T> a) {
 	cout << "A<T>: " << a.t << endl;
}

int main(int argc, char **argv) {
	foo('X');
	foo(string("hello"));
	foo(A<int>(21));
	return 0;
}


$ ./a.out

general: X
string: hello
A<T>: 21

grob ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.