уточнение шаблонного метода

 

ситуация : есть шаблон, скажем

template <typename T>
class TFoo {
public:
   T Result() {
      return (T)content;
   }
}

и необходимо описать(уточнить) метод TFoo<T>::Result() для конкретного типа, например T=double; 

очень хочется написать что-то типа :

double TFoo<double>::Result() { 
    return content==EMPTY_VALUE?0:content;
}

но так нельзя..

а собственно как ?

 

я вообще-то ноль в этом - в интернете ввел( 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());
}
 
Vladimir Simakov:

базовый шаблон не знает о том кто его наследует...

Вносить в него правки нельзя, потому как используется в нескольких проектах. Вот в отдельном проекте надо поменять метод для конкретного типа double.

И желательно чтобы так и остался шаблоном TFoo<double>, а не стал TFooDouble:public TFoo<double>. 

 
Maxim Kuznetsov:

базовый шаблон не знает о том кто его наследует...

Вносить в него правки нельзя, потому как используется в нескольких проектах. Вот в отдельном проекте надо поменять метод для конкретного типа double.

И желательно чтобы так и остался шаблоном TFoo<double>, а не стал TFooDouble:public TFoo<double>. 

Два варианта, точнее три:

  1. Обернуть вызов метода в шаблонную функцию и только ей в проекте и пользоваться
    template<typename Type>
    Type Result(TFoo<Type> &_class) {...}
    
  2. Если такое поведение при типе double должно быть всегда, то никаких проблем - сигнатура метода не поменялась, смело правьте.
  3. Прицепить репозиторий библиотеки к репозиторию проекта как subtree и там уже изменить (надеюсь, git юзаете?)