-1

我有一个三重层次结构类:

template<class T> class Singleton;

class Base;

class Sub : public Base, public Singleton<Sub>;

我使用底层自动指针,这就是为什么 Singleton 是一个模板类,而 Sub 将自己作为模板参数传递。我正在开发 Singleton 和 Base,公共 API 允许任何人添加自己的子类。我实际上想要一个像这样的真正的三重层次结构:

template<class T> class Singleton;

class Base : public Singleton<Base>;

class Sub : public Base;

这样外部开发人员就不必担心模板和复杂性。这样做的问题是,我在 Singleton 中的实现现在将在我创建 Sub 的实例时调用 Base 的构造函数(因为模板参数是 Base)。

我想知道这是否可以通过预处理器宏来完成:

template<class T> class Singleton;

class Base : public Singleton<__CLASS_NAME__>;

class Sub : public Base;

__CLASS_NAME__将被预处理器替换的类名在哪里。理论上这应该是可能的,因为__PRETTY_FUNCTION__宏实际上返回了类名。问题是无法进行字符串操作以从__PRETTY_FUNCTION__.

关于如何实现这一点的任何想法,以便 Sub 类不知道从Singleton<template>类继承?

4

2 回答 2

8

这样外部开发人员就不必担心模板和复杂性。

不可能的。您可以设计 Base 和 Singleton 以消除将模板参数传递给 Singleton 的要求的唯一方法是将其传递给 Base,这没有任何改进。

此外,可以合理预期 C++ 开发人员将能够使用 CRTP。

最后,单身人士以最可怕的方式吸吮。如果您重视自己的理智,请立即删除。

于 2013-03-08T09:04:02.410 回答
1

我对 CRTP ( http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern ) 不是很熟悉,但是让 Base 本身成为模板怎么样?

template<class T> class Singleton;

template<class T> class Base : public Singleton<T>;

class Sub : public Base<Sub>;

于 2013-03-08T09:00:46.180 回答