я вообще-то ноль в этом - в интернете ввел( template <typename T>) какие то примеры - может чем поможет! Хотя я думаю, Вы и сами знаете как это реализовывается
#include "stdafx.h" #include <iostream> using namespace std; #include <iomanip> template <typename T> class Stack { private: T *stackPtr; // указатель на стек int size; // размер стека T top; // вершина стека public: Stack(int = 10);// по умолчанию размер стека равен 10 элементам ~Stack(); // деструктор bool push(const T ); // поместить элемент в стек bool pop(); // удалить из стека элемент void printStack(); }; int main() { Stack <int> myStack(5); // заполняем стек cout << "Заталкиваем элементы в стек: "; int ct = 0; while (ct++ != 5) { int temp; cin >> temp; myStack.push(temp); } myStack.printStack(); // вывод стека на экран cout << "\nУдаляем два элемента из стека:\n"; myStack.pop(); // удаляем элемент из стека myStack.pop(); // удаляем элемент из стека myStack.printStack(); // вывод стека на экран return 0; } // конструктор template <typename T> Stack<T>::Stack(int s) { size = s > 0 ? s: 10; // инициализировать размер стека stackPtr = new T[size]; // выделить память под стек top = -1; // значение -1 говорит о том, что стек пуст } // деструктор template <typename T> Stack<T>::~Stack() { delete [] stackPtr; // удаляем стек } // элемент функция класса Stack для помещения элемента в стек // возвращаемое значение - true, операция успешно завершена // false, элемент в стек не добавлен template <typename T> bool Stack<T>::push(const T value) { if (top == size - 1) return false; // стек полон top++; stackPtr[top] = value; // помещаем элемент в стек return true; // успешное выполнение операции } // элемент функция класса Stack для удаления элемента из стек // возвращаемое значение - true, операция успешно завершена // false, стек пуст template <typename T> bool Stack<T>::pop() { if (top == - 1) return false; // стек пуст stackPtr[top] = 0; // удаляем элемент из стека top--; return true; // успешное выполнение операции } // вывод стека на экран template <typename T> void Stack<T>::printStack() { for (int ix = size -1; ix >= 0; ix--) cout << "|" << setw(4) << stackPtr[ix] << endl; }
template <typename T> class TFoo { T content; public: TFoo(T val):content(val){} T Result() { return Result(content); } double Result(double param) {return param==EMPTY_VALUE?0.0:param;} template<typename Type> Type Result(Type param) {return param;} }; void OnStart() { TFoo<int> a(3); TFoo<double> b(EMPTY_VALUE); Print(a.Result()); Print(b.Result()); }
базовый шаблон не знает о том кто его наследует...
Вносить в него правки нельзя, потому как используется в нескольких проектах. Вот в отдельном проекте надо поменять метод для конкретного типа double.
И желательно чтобы так и остался шаблоном TFoo<double>, а не стал TFooDouble:public TFoo<double>.
базовый шаблон не знает о том кто его наследует...
Вносить в него правки нельзя, потому как используется в нескольких проектах. Вот в отдельном проекте надо поменять метод для конкретного типа double.
И желательно чтобы так и остался шаблоном TFoo<double>, а не стал TFooDouble:public TFoo<double>.
Два варианта, точнее три:
- Обернуть вызов метода в шаблонную функцию и только ей в проекте и пользоваться
template<typename Type> Type Result(TFoo<Type> &_class) {...}
- Если такое поведение при типе double должно быть всегда, то никаких проблем - сигнатура метода не поменялась, смело правьте.
- Прицепить репозиторий библиотеки к репозиторию проекта как subtree и там уже изменить (надеюсь, git юзаете?)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
ситуация : есть шаблон, скажем
и необходимо описать(уточнить) метод TFoo<T>::Result() для конкретного типа, например T=double;
очень хочется написать что-то типа :
но так нельзя..
а собственно как ?