如果我只想在模板中专门化一种方法,我该怎么做?

If I want to specialise just one method in a template, how do I do it?(如果我只想在模板中专门化一种方法,我该怎么做?)
本文介绍了如果我只想在模板中专门化一种方法,我该怎么做?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

假设我有一个模板类

template <typename T> struct Node
{
    // general method split
    void split()
    {
        // ... actual code here (not empty)
    }
};

需要在 Triangle 类的情况下专门化这个......类似

Need to specialise this in the Triangle class case.. something like

template <>
struct Node <Triangle*>
{
    // specialise the split method
    void split() {}
} ;

但我不想想重新重写整个模板!唯一需要更改的是 split() 方法,仅此而已.

but I don't want to rewrite the entire template over again! The only thing that needs to change is the split() method, nothing more.

推荐答案

您可以在类声明之外仅为该函数提供专门化.

You can provide a specialization for only that function outside the class declaration.

template <typename T> struct Node
{
    // general method split
    void split()
    {
        // implementation here or somewhere else in header
    }
};

//cpp中声明的函数原型void splitIntNode( Node & node );

// prototype of function declared in cpp void splitIntNode( Node & node );

template <>
void Node<int>::split()
{
     splitIntNode( this ); // which can be implemented
}

int main(int argc, char* argv[])
{
   Node <char> x;
   x.split(); //will call original method
   Node <int> k;
   k.split(); //will call the method for the int version
}

如果 splitIntNode 需要访问私有成员,您可以将这些成员传递给函数而不是整个节点.

If splitIntNode needs access to private members, you can just pass those members into the function rather than the whole Node.

这篇关于如果我只想在模板中专门化一种方法,我该怎么做?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do compilers treat variable length arrays(编译器如何处理变长数组)
Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数)
check if member exists using enable_if(使用 enable_if 检查成员是否存在)
Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?)
Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用)
Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)