C ++模板参数自动使用类名

时间:2013-03-08 08:28:30

标签: c++ templates inheritance classname

我有一个三层次的类:

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>类?

2 个答案:

答案 0 :(得分:8)

  

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

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

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

最后,Singletons以最恐怖的方式吮吸。如果您重视自己的理智,请立即删除。

答案 1 :(得分: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>;