Информация об изменениях

Сообщение Re[2]: Специализация шаблонов по 2 параметрам от 18.02.2016 13:26

Изменено 18.02.2016 13:27 rg45

Здравствуйте, andyp, Вы писали:

A>Специализацию Test<char> придется определить полностью, так как для компилятора это отдельный класс...


На самом деле, не обязательно. В С++ существует и такая форма специализация для функций-членов шаблонных классов:

template <typename T>
class A
{
public:

   void foo(int);

};
template <>
void A::foo<double>(int) {/*...*/}

template <>
void A::foo<std::string>(int) {/*...*/}

template <>
void A::foo<bool>(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);
}
Здравствуйте, andyp, Вы писали:

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);
}