C++ 无继承地回收成员功能

C++ 无继承地回收成员功能,c++,C++,Wikipedia上有一个有趣的模板 这个模板提供了一些有趣的东西,因为它允许提供关于成员访问的逻辑。在此基础上,我们可以轻松构建如下内容: struct Ranged { ranged_property<float,0,1> unit_property; }; 其中,可影响的_属性的范围受最大值的影响。请记住,我们的目标是让这种模板在许多截然不同的类中循环使用。相关的概念是mixin和decorator 它可以通过宏来完成。。。但是我觉得必须有一个更好的更通用的C++解

Wikipedia上有一个有趣的模板

这个模板提供了一些有趣的东西,因为它允许提供关于成员访问的逻辑。在此基础上,我们可以轻松构建如下内容:

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();
}