C++ 将带有固定签名的自定义函数名注入CRTP

C++ 将带有固定签名的自定义函数名注入CRTP,c++,templates,c++17,crtp,C++,Templates,C++17,Crtp,我想在CRTP(奇怪的重复模板模式)基类中插入一个具有固定签名的待创建函数的名称 下面是我正在使用的现有代码():- 有时,我喜欢直接访问特定的底层:- Dog* dogPtr; /** some ini ...*/ dogPtr->getWalkUnderlying()->stamina=10; 有时,我想以更抽象的方式访问“其他一些函数”:- dogOPtr->runNow(); //a custom function within WalkableO 我使用虚拟继承

我想在CRTP(奇怪的重复模板模式)基类中插入一个具有固定签名的待创建函数的名称

下面是我正在使用的现有代码():-

有时,我喜欢直接访问特定的底层:-

Dog* dogPtr; /** some ini ...*/ dogPtr->getWalkUnderlying()->stamina=10;
有时,我想以更抽象的方式访问“其他一些函数”:-

dogOPtr->runNow();  //a custom function within WalkableO
我使用虚拟继承,因为如果我重新设计使每个
WalkableO
也成为
HasHpO
,我可以像下面那样编辑代码。
我甚至不需要更换
Dog
code:-

struct WalkableO: Crtp<WalkableO,Walkable>, virtual HasHpO{/*something*/};
struct-WalkableO:Crtp,虚拟HasHpO{/*something*/};

Dog
本身可以是
BullDog
TigerDog
等的基类。

不幸的是,声明新函数的选择非常有限

在本例中,您将引入一个新的。之后,标识符只能由一个。在您的约束下,只有三种相关的声明是s、s和s(在声明之上,在本例中,声明必须是简单的声明或函数定义,因为它应该声明函数)。在模板声明中,您声明的唯一名称是在基础简单声明或函数定义中声明的名称,因此我们基本上仅限于简单声明和函数定义。简单声明或函数定义引入的名称在其s中指定,因此无法指定新标识符并自动声明它


P> >在C++中进行预处理之后,没有办法将“透明”传递给已声明的标识符。所以我认为你想做的是不可能的。您必须使用宏,或者自己声明函数。

为什么需要在
BO
中调用
getundernative
的函数?为什么不直接使用
GetUnderground
,省去很多麻烦呢?否则,CRTP基就毫无意义了。“底层”指针的用途是什么?您正在实现pimpl习惯用法吗?如果是这样的话,我相信你能想出比
Crtp
getunderfulding
@Kerndog73更好的名字。谢谢你的好问题。我在我的帖子中回答这个问题,因为这是我应该告诉你的信息。我正在实现一个公共实现(与pimpl类似,但不同)。现在我明白了!您听说过实体组件系统架构吗?我贡献了一个最好的(在我的书中它是最好的)C++ ECS框架,即。我强烈建议你去看看EnTT!你们可以和专家一起讨论EnTT。@Kerndog73 Ha,是的,我正在开发一个ECS库,并将其用于我的游戏。谢谢你的链接。不幸的是,这个答案可能是我需要听到的。谢谢。@CPP初学者您可以试试EnTT。正如Kerndog73所提到的,这是一个非常好的例子library@Sneaky乌龟:我以前预习过那个很棒的图书馆。好吧,这个问题不能用EnTT解决。我非常喜欢面向对象,希望有一种优雅的方式将OO与ECS结合起来。部分幸运的是,宏可以优雅地混合使用。@CPP初学者OO和ECS不能混合使用。它们几乎是对立的。嗯,ECS做对了比OO优雅得多。如果我是残酷的诚实,那么问题中的代码并不优雅。也许你可以问一个关于你和EnTT之间的问题?@鬼鬼祟祟的乌龟哈哈,是的,这可能只是我自己的想法。我莫名其妙地问了另一个问题——他们回答“不要这样做!”。
Dog* dogPtr; /** some ini ...*/ dogPtr->getWalkUnderlying()->stamina=10;
dogOPtr->runNow();  //a custom function within WalkableO
struct WalkableO: Crtp<WalkableO,Walkable>, virtual HasHpO{/*something*/};