C++ 包含依赖于类成员的模板的类
我们的目标是制作一种“智能getter”,它从当前对象中获取值(如果当前对象存在),如果当前对象不存在,则在父对象中查找该值 因此,这个ValueGetter类包含指向它所包含的对象的指针(作为构造函数中的运行时参数获取),以及指向它所操作的成员的指针(作为模板参数) 这是最简单的例子:C++ 包含依赖于类成员的模板的类,c++,templates,pointer-to-member,C++,Templates,Pointer To Member,我们的目标是制作一种“智能getter”,它从当前对象中获取值(如果当前对象存在),如果当前对象不存在,则在父对象中查找该值 因此,这个ValueGetter类包含指向它所包含的对象的指针(作为构造函数中的运行时参数获取),以及指向它所操作的成员的指针(作为模板参数) 这是最简单的例子: template <class StyleType, int StyleType::*value> struct ValueGetter { ValueGetter(StyleType* con
template <class StyleType, int StyleType::*value>
struct ValueGetter
{
ValueGetter(StyleType* containedIn);
int get();
// Looks if the value is present in this style,
// if not it looks for the value in the parent style
};
struct Style
{
Style *parent;
int a;
ValueGetter<Style, &Style::a> x; // Error: 'Style::a' : is not a type name, static, or enumerator
};
模板
结构参数获取程序
{
ValueGetter(样式类型*包含在中);
int get();
//查看此样式中是否存在该值,
//如果不是,则在父样式中查找值
};
结构样式
{
风格*父母;
INTA;
ValueGetter x;//错误:“Style::a”:不是类型名、静态或枚举数
};
当我将x移到类的作用域之外时,它将编译。
通常,类可能包含依赖于类类型的模板,那么为什么这不起作用呢?
有没有其他方法可以解决这个问题,而不必在构造函数中存储运行时指向成员的指针?(因此该结构将包含每个值的额外指针)
< >编辑:我只是在GCC中成功编译了它,但在MSVC(2012)中没有这样做,所以MSVC编译器错误?< P>我不认为指针(不与T*类型中的指针类型混淆)被允许作为03个C++中的模板参数,只允许类型名、积分常量或枚举常数。甚至不是浮点/双常量。这包括类成员指针
更新:
此外,静态非类型参数也起作用:
template <class StyleType, int *value>
struct ValueGetter
{
ValueGetter(StyleType* containedIn);
int get();
// Looks if the value is present in this style,
// if not it looks for the value in the parent style
};
struct Style
{
Style *parent;
static int a;
ValueGetter<Style, &Style::a> x; // Error: 'Style::a' : is not a type name, static, or enumerator
};
模板
结构参数获取程序
{
ValueGetter(样式类型*包含在中);
int get();
//查看此样式中是否存在该值,
//如果不是,则在父样式中查找值
};
结构样式
{
风格*父母;
静态int a;
ValueGetter x;//错误:“Style::a”:不是类型名、静态或枚举数
};
您使用的编译器是什么?注意:您在MSVC 2012中编写的GCC 4.7.2上的代码片段。int样式类型::*
应该是什么?如前所述,这似乎是惊人的MSVC2012 C++11编译器中的一个缺陷。:)a
不在场意味着什么?a
是否必须是Style
的裸体成员?即,模板结构属性{static_assert(std::is_base::value,“CRTP failure”);T value;}代码>,使用GetProperty(object)
访问技术?