Специализация шаблонного класса, который является членом шаблонного класса - PullRequest
8 голосов
/ 22 марта 2019

Возможно ли иметь специализированный шаблонный класс, который является членом шаблонного класса (который сам по себе не является специализированным)?

С родительским классом, не являющимся шаблоном, это работает:

class owner
{
    template<int num>
    struct s
    {
        int ret() { return num; }
    };
};

template<>
struct owner::s<0>
{
    int ret() { return 0; }
};

Но при создании owner шаблонного класса это не так:

template<typename some>
class owner
{
    template<int num>
    struct s
    {
        int ret() { return num; }
    };
};

template<typename some>
struct owner<some>::s<0>
{
    int ret() { return 0; }
};

Поиск показывает, что это невозможно (?) Для функций, но как насчет классов / структур? Специализация шаблонного члена шаблонного класса

1 Ответ

5 голосов
/ 22 марта 2019

Нет, это невозможно.Шаблон класса члена может быть специализированным только в том случае, если все его шаблоны классов также являются специализированными.Цитирование C ++ 2x (N4713) [temp.expl.spec] 17.8.3 / 17:

В явном объявлении специализации для члена шаблона класса или шаблон элемента , который появляется в области пространства имен, шаблон элемента и некоторые из его шаблонов классов, в которые он включен, могут оставаться не специализированными, за исключением того, что объявление не должно явно специализировать шаблон элемента класса, если его шаблоны классов не являютсятакже явно специализированные.

(выделение мое)

В некоторых случаях вы можете обойти это, сделав вложенное имя s псевдонимом пространства имен.помощник области, который может быть частично специализированным.Примерно так:

template <class some, int num>
struct s_helper
{
  int ret() { return num; }
};

template<typename some>
class owner
{
    template<int num>
    using s = s_helper<some, num>;
};

template<typename some>
struct s_helper<some, 0>
{
    int ret() { return 0; }
};

Чтобы уменьшить экспозицию s_helper, ее, конечно, можно спрятать в подходяще названном внутреннем пространстве имен (например, detail).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...