Требуется множественная частичная специализация и полная специализация <> после определения типа
Я использую класс C++ "событие", который позволял одному или двум аргументам в быть вызванными делегатами.
В последнее время я добавил поддержку для делегатов, которые не требуют аргументов, однако, когда я специализирую класс на использовании аргументов шаблона, я все равно должен добавить <> после определения класса.
Пример использования с одним / двумя аргументами:
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 ответа
Если вы хотите вызвать функцию foo без аргументов, вы должны написать foo()
не просто foo
, Это точно так же для типов шаблонов. event
это не тип, это "функция", которая принимает типы и возвращает тип. Если вы действительно хотите избежать написания скобок, вы все равно можете сделать что-то вроде:
typedef event<> event_;
Скобки требуются, потому что грамматика C++ говорит так.
В 14.2/1 (temp.names/1), <и> не являются обязательными, в то время как template-arguments-list есть. Таким образом, событие<> является допустимым идентификатором шаблона, в то время как событие не связано с отсутствием <>.
template-id:
template-name < template-argument-list opt >