C++ 模板类外部长定义的替代方法

C++ 模板类外部长定义的替代方法,c++,templates,C++,Templates,假设我有一个模板类,我想在类之外定义operator=: template<uint32_t total_count, uint32_t init_count, uint32_t node_count> class cls { ... cls & operator= (cls && c); ... }; template<uint32_t total_count, uint32_t init_count, uint32_t no

假设我有一个模板类,我想在类之外定义
operator=

template<uint32_t total_count, uint32_t init_count, uint32_t node_count>
class cls
{
    ...
    cls & operator= (cls && c);
    ...
};

template<uint32_t total_count, uint32_t init_count, uint32_t node_count>
cls<total_count, init_count, node_count> & 
cls<total_count, init_count, node_count>::operator= 
(cls<total_count, init_count, node_count> && c)
{
    ...
}
模板
cls类
{
...
cls&operator=(cls&c);
...
};
模板
cls&
cls::运算符=
(cls&c)
{
...
}

除了缩短模板参数名称外,上述定义还有其他替代方法吗?

您的定义版本会重复模板参数的次数超过必要的次数。函数的限定名告诉编译器上下文是具有指定模板参数的
cls
类模板。在这一点之后,任何出现的
cls
(不带参数)都可以被假定为表示此上下文,类似于您在模板定义中所做的操作。因此,不需要参数列表中的显式模板参数;一个简单的
cls
将被假定为意味着
cls

语法技巧同样可以简化返回类型。在C++11中引入的,允许在函数名引入上下文后声明返回类型。与参数列表一样,一旦处于正确的上下文中,就可以忽略模板参数

template<uint32_t total_count, uint32_t init_count, uint32_t node_count>
auto cls<total_count, init_count, node_count>::operator= (cls && c) -> cls & 
{
    ...
}
模板
自动cls::运算符=(cls&c)->cls&
{
...
}

社区wiki,因为这些简化是由POW和parktomatomi在评论中给出的。

cls&&c
也可以是
cls&&c
,使用尾部返回类型:
auto…->cls&
(此处的“…”不是实际语法)