我有一个三层次的类:
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>
类?
答案 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>;