Требуется множественная частичная специализация и полная специализация <> после определения типа - PullRequest
0 голосов
/ 14 сентября 2010

Я использую класс C ++ «событие», который позволял одному или двум аргументам в быть вызванными делегатами.

В последнее время я добавил поддержку для делегатов, которые не требуют аргументов, однако, когда я специализирую класс на использовании аргументов шаблона, я все равно должен добавить <> после определения класса. 1005 *

Пример использования с одним / двумя аргументами:

class Example 
{
public:
    event<int> SingleArgEvent;
    event<int, int> DoubleArgEvent;
};

А вот пример без аргументов:

class Example 
{
public:
    event<> NoArgTest1; // compiles just fine
    event NoArgTest2;   // gives me C2955: 'event' : use of class template requires template argument list
};

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

class null_typelist {};
/** event template **/
template <class Targ1 = null_typelist, class Targ2 = null_typelist>
class event : public event2_base<Targ1, Targ2>
{
};

template <class Targ>
class event<Targ, null_typelist> : public event1_base<Targ>
{
};

template <>
class event<null_typelist, null_typelist> : public event0_base
{
};

Ответы [ 2 ]

3 голосов
/ 14 сентября 2010

Требуются скобки, потому что грамматика C ++ говорит об этом.

В 14.2 / 1 (temp.names / 1), <и> не являются обязательными, в то время как template-arguments-list есть. Таким образом, событие <> является допустимым идентификатором шаблона, в то время как событие не связано с отсутствием <>.

template-id:
           template-name  < template-argument-list opt >
3 голосов
/ 14 сентября 2010

Если вы хотите вызвать функцию foo без аргументов, вы должны написать foo(), а не просто foo. Это точно так же для типов шаблонов. event это не тип, это «функция», которая принимает типы и возвращает тип. Если вы действительно хотите избежать написания скобок, вы все равно можете сделать что-то вроде:

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