C++ 无继承地回收成员功能
Wikipedia上有一个有趣的模板 这个模板提供了一些有趣的东西,因为它允许提供关于成员访问的逻辑。在此基础上,我们可以轻松构建如下内容:C++ 无继承地回收成员功能,c++,C++,Wikipedia上有一个有趣的模板 这个模板提供了一些有趣的东西,因为它允许提供关于成员访问的逻辑。在此基础上,我们可以轻松构建如下内容: struct Ranged { ranged_property<float,0,1> unit_property; }; 其中,可影响的_属性的范围受最大值的影响。请记住,我们的目标是让这种模板在许多截然不同的类中循环使用。相关的概念是mixin和decorator 它可以通过宏来完成。。。但是我觉得必须有一个更好的更通用的C++解
struct Ranged {
ranged_property<float,0,1> unit_property;
};
其中,可影响的_属性
的范围受最大值
的影响。请记住,我们的目标是让这种模板在许多截然不同的类中循环使用。相关的概念是mixin和decorator
它可以通过宏来完成。。。但是我觉得必须有一个更好的更通用的C++解决方案。
编辑添加:我认为这可以通过保存对ranged_属性模板内成员的引用来实现。。。但这似乎完全是在浪费空间,因为它实际上是一个常量预计到达时间;一个常量引用实际上可以达到这个目的,但是,我需要做调查 继我们在评论中的讨论之后,似乎可以通过这样一个指向成员模板参数的指针来实现该功能(但请参见下面的注意事项):
#包括
模板
结构打印成员{
C&obj;
打印成员(C&obj):obj(obj){};
void print(){std::cout为什么希望max
成为AdjustableRange
中的一个单独的数据成员,而不是将其封装为Range\u属性
对象的一个成员(然后将其指定给构造函数)?我不确定引用是否会浪费空间。引用实际上是如何实现的,这是实现定义的,但最终,它们只是同一对象的另一个名称,因此与使用原始变量名相比,编译器输出可能不会有任何可见的变化。也许,更了解主要编译器内部orkings可以对此进行评论…模板是编译时结构,不能用运行时值初始化。他说的是“类似的功能”我打赌ranged\u属性
是指伪代码。这种解释也得到了参考思想的支持。因此它也可以是ranged\u属性influenceable\u属性;
,其中influenceable\u属性
初始化为(0,max)
/(0,&max)
或诸如此类……我认为实际上标题/标记太过受限——我感兴趣的是依赖于成员的可回收功能。在我的特定用例中,我希望这些成员尽可能不定义任何空间,因为他们使用的所有数据都将包含在父类中。我将不得不做一些调查,如@Oguk可能是正确的,推荐人会给我我想要的。我会编辑一下标题。
struct AdjustableRanged {
float max;
ranged_property<float,0,max> influenceable_property;
};
#include <iostream>
template<typename C, typename T, T C::*m>
struct PrintMember {
C& obj;
PrintMember(C& obj) : obj(obj) {};
void print() { std::cout << "Member of containing class: " << obj.*m << std::endl; };
};
struct TestClass {
int data;
PrintMember<TestClass, int, &TestClass::data> pm;
TestClass() : pm(*this){};
};
int main()
{
TestClass tc;
tc.data = 5;
tc.pm.print();
}