Ответ на ваш вопрос зависит от целей, которые вы пытаетесь достичь.Итак, первое.Не забывайте, что шаблоны и ООП, как правило, ортогональны.Каждая специализация шаблона - это новый тип, который не связан с другими.Поэтому единственный способ привести все специализации к одному и тому же типу - это наследовать от одного базового класса.Итак
class AbstractHelper
{
public:
virtual ~AbstractHelper() {}
};
template <typename T>
class helper : public AbstractHelper
Второе.Вам нужно ответить на вопрос - могут ли данные ваших шаблонных классов обрабатываться одним обработчиком или это нецелесообразно (исходя из соображений производительности, сложности реализации и т. Д.) Предположим, что это возможно, например, в виде строк.В этом случае вам нужно:
class AbstractHelper
{
public:
virtual string getDataString() { return ""; }
...
template <typename T>
class helper : public AbstractHelper
{
public:
string getDataString()
{
return to_string(data);
}
Если это не приемлемо, вам нужно ответить на вопрос, возможно ли полностью инкапсулировать обработку данных?Предположим, вы можете.Затем
class AbstractHelper
{
public:
virtual void printData() { }
...
template <typename T>
class helper : public AbstractHelper
{
public:
void printData()
{
cout << data << endl;;
}
Наконец, наиболее сложный вариант заключается в том, что вам нужна разная обработка для всех типов, и она не может быть инкапсулирована.Затем вам нужно определить тип источника и использовать динамическое приведение типа:
enum Type
{
TYPE_SHORT,
TYPE_LONG,
TYPE_STRING
...
class AbstractHelper
{
protected:
Type type_;
public:
Type getType() { return type_; }
......
template <typename T>
class helper : public AbstractHelper
{
public:
helper()
{
stringstream temp;
if (is_same<T, short>::value)
{
temp << 1;
type_ = TYPE_SHORT;
}
else if (is_same<T, long>::value)
{
temp << 1024;
type_ = TYPE_LONG;
}
...
и выбрать нужный обработчик:
switch (my_helper.getType())
{
case TYPE_SHORT:
cout << dynamic_cast<helper<short>&>(my_helper).getData() << endl;
break;
case TYPE_LONG:
cout << dynamic_cast<helper<long>&>(my_helper).getData() << endl;
Не смущайтесь количеством ручного кода - макросыи шаблоны могут значительно уменьшить его.