Я сделал специализированную базу шаблонов на основе исходного класса шаблонов, например:
Базовый шаблон:
template <typename T>
class MyData {
public:
MyData(T param) : data(param) {}
T GetData() const {
return data;
}
private:
T data;
};
Специализированный шаблон:
template <>
class MyData<char*> {
public:
MyData(const char* param) {
int len = static_cast<int>(strlen(param));
data = new char[len + 1];
strcpy_s(data, static_cast<rsize_t>(len + 1), param);
}
~MyData() {
delete[] data;
}
const char* GetData() const {
return data;
}
private:
char* data;
};
Этот код работает хорошо, но мне интересно, есть ли какие-либо явные условия для типа специализации шаблона. Например, если я делаю специализацию функции, тип возвращаемого значения и тип всех параметров должны быть одинаковыми.
template <>
const char* Add(const char* pLeft, const char* pRight) {
----------- ----------- -----------
| | |
+----------------+------------------+
...
}
В классе MyData тип шаблона класса — char*, но тип параметра конструктора — const char*. Однако при компиляции кода ошибки нет. Поэтому я хочу знать, есть ли какие-либо условия типа, подобные этому, в специализации шаблона класса.
И это неверно в отношении специализации функций — это верно в этом конкретном случае, но не в том случае, если параметр является шаблонным типом. Выбор специализации шаблона осуществляется во время компиляции, поэтому они не должны быть абсолютно одинаковыми, поскольку их вызовы могут быть известны заранее и настроены по-разному.





Здесь есть разница между специализациями функций и специализациями классов. Специализации классов могут быть совершенно разных типов с другим набором членов, функций и базовых классов. Следующее хорошо компилируется:
template <typename T>
class Foo
{
public:
void Bar() {}
private:
int val;
};
class Parent {};
template <>
class Foo<char> : public Parent
{
public:
void BarBar() {}
private:
double val;
};
int main()
{
Foo<int> f;
Foo<char> ff;
}
Количество типов в специализации должно совпадать с количеством типов в исходном неспециализированном шаблоне. Кроме этого, я не могу сказать, о чем вы спрашиваете. Различные типы шаблонов не связаны, поэтому к ним нет требований... это совершенно несвязанные типы, которые просто выбираются на основе предоставленного типа.