инкапсулировать шаблоны C ++ - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь реализовать шаблон с явной спецификацией шаблона. Шаблон и его реализация показаны ниже:

template <typename T>
class MyClass {
private:
    T data;
    size_t size;

public:
    MyClass();
    ~MyClass();

    uint32_t getSize();

    T getData();
    void setData(T value);
};
template <class T>
MyClass<T>::MyClass()
{
    size = sizeof(T);
}
template <>
MyClass<std::string>::MyClass()
{ 
    size = 0;
}

/* and so on */

Теперь у меня есть проблема, когда мое явное объявление содержит также шаблон класса. Допустим, я бы создал явную шаблонную специализацию вектора (содержащего любой примитивный тип, например int, char, float, ...) и сохранил бы сайт элемента в переменной size.

template <??>
MyClass<std::vector<?>>::MyClass()
{ 
    size = sizeof(?);
}

Как я мог это сделать?

1 Ответ

2 голосов
/ 08 февраля 2020

Вы должны специализировать класс, а не методы:

#include <string>
#include <vector>

template <typename T>
class MyClass {
private:
    T data;
    size_t size;

public:
    MyClass();
    ~MyClass();

    uint32_t getSize();

    T getData();
    void setData(T value);
};

template <class T>
MyClass<T>::MyClass()
{
    size = sizeof(T);
}
template <>
MyClass<std::string>::MyClass()
{ 
    size = 0;
}

template<class T>
class MyClass<std::vector<T>>
{
    MyClass();

    T data;
    size_t size;
};

template<class T>
MyClass<std::vector<T>>::MyClass()
{ 
    size = sizeof(T);
}
...