需要多个部分专业化和完全专业化<>类型定义后

发布于 2024-09-19 02:08:28 字数 969 浏览 5 评论 0 原文

我正在使用一个 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
{
};

I'm using an C++ "event" class that allowed one or two arguments in the to be called delegates.

Lately I've added support for delegates that don't require arguments, however when I specialze the class to use no template arguments I'm still required to add <> afther the class definition.

Example usage with one/two arguments:

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

And here the no argument example:

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

As it works with the brackets, I don't see a reason why they should to be there.
Here's the class specialization code:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

太阳公公是暖光 2024-09-26 02:08:28

如果您想调用不带参数的函数 foo,则必须编写 foo() 而不仅仅是 foo。这对于模板类型来说是完全相同的。 event 不是类型,它是一个接受类型并返回类型的“函数”。
如果你真的想避免写括号,你仍然可以这样做:

typedef event<> event_;

If you want to call a function foo with no arguments you have to write foo() not just foo. That is exactly the same for template types. event is not a type, it is a "function" that takes types and return a type.
If you really want to avoid writing the brackets, you can still do something like:

typedef event<> event_;
半葬歌 2024-09-26 02:08:28

括号是必需的,因为 C++ 语法是这么规定的。

在 14.2/1 (temp.names/1) 中,<和>不是可选的,而 template-argument-list 是可选的。所以事件>>是有效的模板 ID,而事件不是由于缺少 <>。

template-id:
           template-name  < template-argument-list opt >

Brackets are required because the C++ grammar says so.

In 14.2/1 (temp.names/1), < and > are not optional, while template-argument-list is. So event<> is a valid template-id while event is not due to lack of <>.

template-id:
           template-name  < template-argument-list opt >
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文