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

goo*_*ons -1 c++ inheritance templates classname

我有一个三层次的类:

template<class T> class Singleton;

class Base;

class Sub : public Base, public Singleton<Sub>;
Run Code Online (Sandbox Code Playgroud)

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

template<class T> class Singleton;

class Base : public Singleton<Base>;

class Sub : public Base;
Run Code Online (Sandbox Code Playgroud)

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

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

template<class T> class Singleton;

class Base : public Singleton<__CLASS_NAME__>;

class Sub : public Base;
Run Code Online (Sandbox Code Playgroud)

哪个__CLASS_NAME__类名将由预处理器替换.从理论上讲,这应该是可能的,因为__PRETTY_FUNCTION__宏实际上返回了类名.问题是,无法执行字符串操作以从中删除函数名称__PRETTY_FUNCTION__.

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

Pup*_*ppy 8

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

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

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

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

  • @goocreations我认为你的主要问题是你真的没有理解使用单例的所有含义,因此正在制作这种未经证实的声明. (4认同)
  • 如果你真的了解设计模式,你会知道,回想起来,作者希望他们忘记了`Singleton`. (3认同)
  • 我很高兴看到我对单身人士的强烈仇恨被比我聪明得多的人分享;-) (2认同)
  • +1"单身人士以最恐怖的方式吮吸" (2认同)