Сообщение Re[2]: Специализация шаблонов по 2 параметрам от 18.02.2016 13:26
Изменено 18.02.2016 13:38 rg45
Здравствуйте, andyp, Вы писали:
A>Специализацию Test<char> придется определить полностью, так как для компилятора это отдельный класс...
На самом деле, не обязательно. В С++ существует и такая форма специализация для функций-членов шаблонных классов:
И это именно специализация функций-членов, без специализации самого шаблонного класса.
Такая форма специализации, конечно же, допустима и для конструкторов. Поэтому в исходном примере достаточно просто заменить специализацию конструкторов на перегрузку:
A>Специализацию Test<char> придется определить полностью, так как для компилятора это отдельный класс...
На самом деле, не обязательно. В С++ существует и такая форма специализация для функций-членов шаблонных классов:
template <typename T>
class A
{
public:
void foo(int);
};
template <>
void A<double>::foo(int) {/*...*/}
template <>
void A<std::string>::foo(int) {/*...*/}
template <>
void A<bool>::foo(int) {/*...*/}
И это именно специализация функций-членов, без специализации самого шаблонного класса.
Такая форма специализации, конечно же, допустима и для конструкторов. Поэтому в исходном примере достаточно просто заменить специализацию конструкторов на перегрузку:
template<class T>
class Test
{
public:
template <class T2>
Test(const T2* sz)
{
printf ("common version\n");
}
Test(const char* sz)
{
printf ("T.a. str: %s\n", sz);
}
Test(const wchar_t* sz)
{
printf ("T.w. str: %S\n", sz);
}
protected:
};
// Поная специализация конструктора без специализации самого шаблонного класса:
template<>
Test<char>::Test(const wchar_t* sz)// компилируется
{
printf ("a.w. str: %S\n", sz);
}
Re[2]: Специализация шаблонов по 2 параметрам
Здравствуйте, andyp, Вы писали:
A>Специализацию Test<char> придется определить полностью, так как для компилятора это отдельный класс...
На самом деле, не обязательно. В С++ существует и такая форма специализации для функций-членов шаблонных классов:
И это именно специализация функций-членов, без специализации самого шаблонного класса.
Такая форма специализации, конечно же, допустима и для конструкторов. Поэтому в исходном примере достаточно просто заменить специализацию конструкторов на перегрузку:
A>Специализацию Test<char> придется определить полностью, так как для компилятора это отдельный класс...
На самом деле, не обязательно. В С++ существует и такая форма специализации для функций-членов шаблонных классов:
template <typename T>
class A
{
public:
void foo(int);
};
template <>
void A<double>::foo(int) {/*...*/}
template <>
void A<std::string>::foo(int) {/*...*/}
template <>
void A<bool>::foo(int) {/*...*/}
И это именно специализация функций-членов, без специализации самого шаблонного класса.
Такая форма специализации, конечно же, допустима и для конструкторов. Поэтому в исходном примере достаточно просто заменить специализацию конструкторов на перегрузку:
template<class T>
class Test
{
public:
template <class T2>
Test(const T2* sz)
{
printf ("common version\n");
}
Test(const char* sz)
{
printf ("T.a. str: %s\n", sz);
}
Test(const wchar_t* sz)
{
printf ("T.w. str: %S\n", sz);
}
protected:
};
// Поная специализация конструктора без специализации самого шаблонного класса:
template<>
Test<char>::Test(const wchar_t* sz)// компилируется
{
printf ("a.w. str: %S\n", sz);
}