gpt4 book ai didi

c++ - 将具有固定签名的自定义函数名称注入(inject) CRTP

转载 作者:行者123 更新时间:2023-12-02 04:40:16 25 4
gpt4 key购买 nike

我想将一个具有相当固定签名的待创建函数的名称注入(inject)到CRTP(奇怪的重复模板模式)基类中。

这是我现有的工作代码(coliru MCVE link):-

#include <iostream>
#include <string>
//--- library layer ---
template<class O,class Under> struct Crtp{
Under* oNo=nullptr;
auto getUnderlying(){
return oNo;
}
};
//--- user layer ex 1 ---
struct B{ // please don't edit this class
int k=0;
};
struct BO : Crtp<BO,B>{
auto getBOUn(){ return Crtp<BO,B>::getUnderlying();}
// some other functions
};
//--- user layer ex 2 ---
struct C{ // please don't edit this class
int kad=0;
};
struct CO : Crtp<CO,C>{
auto getCOUn(){ return Crtp<CO,C>::getUnderlying();}
// some other functions
};

int main() {
BO bo; B b; bo.Crtp<BO,B>::oNo=&b; //<-- please don't edit
std::cout<< bo.getBOUn()->k;
}

我希望这会很简单:-

//--- user layer ex 1 ---
struct B{ // (same)
int k=0;
};
struct BO : Crtp<BO,B,getBOUn>{ //<--- so easy and clean
// some other functions
};

可以吗,如何实现?

我有 >100 个类对,例如 BBO ;它们对于类似于 getBOUn() 的函数有自己独特的自定义名称。

我可以用宏来修复它,但我不想要另一层困惑。
请不要使用宏回答。

真实用例

我经常创建这样的类:-

struct Walkable{
float stamina =0 ;
float speed =0;
};
struct WalkableO: Crtp<WalkableO,Walkable>{
auto getWalkUnderlying(){ return Crtp<BO,B>::getUnderlying();}
void runNow(){
if(getWalkUnderlying()->stamina >1 ){
getWalkUnderlying()->speed +=3;
getWalkUnderlying()->stamina --;
}
}
};

class Dog : public virtual WalkableO, public virtual HasHpO, public virtual EatenableO {};

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

Dog* dogPtr; /** some ini ...*/ dogPtr->getWalkUnderlying()->stamina=10;

有时,我想以更抽象的方式访问“一些其他功能”:-

dogOPtr->runNow();  //a custom function within WalkableO

我使用虚拟继承,因为如果我重新设计来制作例如每个 WalkableObe HasHpO,我可以像下面这样编辑代码。
我什至不需要更改 Dog 代码:-

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

Dog 本身可以是 BullDogTigerDog 等的基类。

最佳答案

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

在本例中,您将引入一个新的 identifier 。之后preprocessing标识符只能由 declaration 引入。在您的限制下,仅有三种相关的声明类型是 simple-declaration s,function-definition s,和template-declaration s(在声明之上,在这种情况下必须是简单声明函数定义,因为它应该声明一个函数)。在模板声明中,您声明的唯一名称是在底层简单声明函数中声明的名称定义,所以我们基本上仅限于简单声明函数定义。由简单声明函数定义引入的名称在其declarator中指定。 s,因此无法指定新的标识符并自动声明它。

换句话说,在 C++ 中进行预处理后,无法“透明地”传递要声明的标识符。所以我认为你想做的事情是不可能的。您必须使用宏,或者自己声明函数。

关于c++ - 将具有固定签名的自定义函数名称注入(inject) CRTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60033109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com