繁体   English   中英

C ++部分模板专业化

[英]C++ partial template specialization

这个答案被认为是“好”的代码还是只是一个丑陋的黑客?

而且我想知道这是如何向前声明的(两个类)。

当我只使用2个模板参数向前声明类时,无论有什么值flag ,它都只需要这个参数。

我想这样做是因为我有2个特殊的成员函数,这些函数在flag为true时表现不同,我不想重新实现整个类。 另外,它应该具有相同的名称。 根据这个例子,这似乎是可能的。

我必须向前声明它,因为我正在创建一个库,我们在其中向前声明所有内容。

任何想法?

它有一个缺点,那就是它不能真正起作用。 不会覆盖基本成员函数,但是当您尝试从外部调用它时,它只是被派生类的函数隐藏。 这意味着如果你从基类中调用doSomething (可能你所有其他函数都存在),它将调用基类doSomething ,这不是你想要的。

在该问题上接受的答案显示了解决问题的多种方法。

为了使用特化,其定义始终必须对调用者可见。 例如,如果你有template <class Type, bool flag> struct something在一个头文件和template <class Type> struct something<Type, true> : public something<Type, false>定义的template <class Type, bool flag> struct something template <class Type> struct something<Type, true> : public something<Type, false>在第二个中定义,使用后者你必须包括第二个标题 否则,您将始终获得第一个更通用的类型。

编辑:关于向前声明的一点让我思考。 如果要仅使用类型声明,如在指针变量中,请执行以下操作:

template <class Type, bool flag>
struct something;

struct Test
{
    something<int, true>* ptr; // definition not needed
    Test();
}

资源

#include "something.h" // header with template
#include "something_spec.h" // header with specialisation

Test::Test()
{
    ptr = new something<int, true>(); // specialisation used
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM