我尝试使用c上的属性来使用它,而不是数据类中太多的setter和getter函数有很多成员变量。
有两个属性类。第一个函数有固定的setter和getter函数,默认为set,get。第二个支持使用其类的自定义setter和getter函数。下面是代码
template <class T>
class Property
{
T data;
public:
// access with function call syntax
Property() : data() { }
T operator()() const
{
return data;
}
T operator()( T const & value)
{
data = value;
return data;
}
// access with get()/set() syntax
T get() const
{
return data;
}
T set( T const & value )
{
data = value;
return data;
}
// access with '=' sign
operator T() const
{
return data;
}
T operator = ( T const & value )
{
data = value;
return data;
}
typedef T value_type; // might be useful for template deductions
};
// a read-write property which invokes user-defined functions
template <class T, class Object, T(Object::*real_getter)(), T(Object::*real_setter)(T const &) >
class RWProperty
{
Object * my_object;
public:
// this function must be called by the containing class, normally in a
// constructor, to initialize the RWProperty so it knows where its
// real implementation code can be found
void operator () ( Object * obj )
{
my_object = obj;
}
// function call syntax
T operator()() const
{
return (my_object->*real_getter)();
}
T operator()( T const & value )
{
return (my_object->*real_setter)( value );
}
// get/set syntax
T get() const
{
return (my_object->*real_getter)();
}
T set( T const & value )
{
return (my_object->*real_setter)( value );
}
// access with '=' sign
operator T() const
{
return (my_object->*real_getter)();
}
T operator = ( T const & value )
{
return (my_object->*real_setter)( value );
}
typedef T value_type; // might be useful for template deductions
};
我正在OptionSet类中测试这些属性,然后将其放入项目代码中
#include <QString>
class OptionSet
{
public:
explicit OptionSet() {}
Property<QString> m_MeshMode;
RWProperty<uint, OptionSet, &getNumberOfVbo, &setNumberOfVbo> uNumberOfVbo;
// this causes problems
protected:
private:
Property<uint> m_uNumberOfVbo;
uint setNumberOfVbo(const uint& rVboCount)
{
// something to do here
return m_uNumberOfVbo(rVboCount);
}
uint getNumberOfVbo() const
{
return m_uNumberOfVbo();
}
};
但在使用RWProperty时,即使我传递了模板类型的4个参数,类类型也有setter和getter函数,getter函数指针,setter函数指针,它说
”错误的模板参数数(3,应该是4):RWProperty
“提供给”模板
我想我在模板中传递参数是错误的。
有人知道发生了什么吗?
您的代码中有三个错误:
首先,要获取成员函数的地址,需要包含类名:
RWProperty<uint, OptionSet
, &OptionSet::getNumberOfVbo
// ~~~~~~~~~~~^
, &OptionSet::setNumberOfVbo> uNumberOfVbo;
// ~~~~~~~~~~~^
其次,要形成指向限定成员函数的指针,需要在该指针的声明中附加关键字:
T (Object::*real_getter)() const
// ~~~~^ to match 'uint getNumberOfVbo() const'
最后,OptionSet
内部的OptionSet
本身是一种不完整的类型。除非该成员的声明点在前面,否则您不能引用它的成员。这基本上意味着您需要在OptionSet
中重新排序您的声明,以便setNumberOfVbo
和getNumberOfVbo
在您声明uNumberOfVbo
数据成员之前:
class OptionSet
{
//...
uint setNumberOfVbo(const uint& rVboCount) { /*...*/ }
uint getNumberOfVbo() const { /*...*/ }
// Ok, now they are known and can be found in the class scope
//...
RWProperty<uint, OptionSet
, &OptionSet::getNumberOfVbo
, &OptionSet::setNumberOfVbo> uNumberOfVbo;
};
我尝试在具有不可见结构器类(字符串变量0,记录器var1,记录器上下文变量2)的最终类中访问info(字符串变量)方法) 这就是错误
我想将的样条插值包含到一个更大的公式中,并想借助确定这个公式的导数。 我尝试了以下代码: 令人沮丧的是,代码的编译给出了以下错误信息: 我怎样才能避免这个错误?提前感谢您提供的任何有用提示。 本征版本是3.2。1.Eigen版本3.1和3.0的编译也失败。 编译器版本为: gcc 4.8版。1(Ubuntu/Linaro 4.8.1-10ubuntu9)
以下代码使用gcc和MSVC编译,但使用clang失败,我使用clang-3.5和当前主干进行了测试)。 clang实例化了函数体并在上出错。gcc和MSVC只查看函数声明,而忽略正文中的。 如果您删除Constexpr,所有编译器都会很好地编译代码。 问题: 如果声明了返回类型,是否允许decltype查看函数体? 我正在寻找标准中相应章节的参考。
我有以下代码使用可变参数模板来调用std::async, 但我收到以下编译错误消息: 没有用于调用“async(std::launch,bool (TestChild:: 我认为这可能与我传递其他参数以及参数包的事实有关。任何人都知道这有什么问题,我应该做些什么来让它发挥作用?
问题内容: 在我正在开发的PHP Web应用程序中,我看到以两种可能的方式定义的函数。 方法1: 方法二: 什么时候应该使用一种方法来替代另一种方法?看来,如果系统要求不断变化,因此myfunc的参数数量不断变化,则方法1可能需要大量维护。 问题答案: 如果系统变化频繁,以至于使用索引数组是最好的解决方案,那么我想这就是您的后顾之忧。:-) 通常,函数/方法不应使用太多参数(5个加减2是最大值),
我正在构建一些输入检查器,需要为整数和/或双精度设置特定的函数(例如,“iPrime”应该只适用于整数)。 如果我使用作为参数,它工作得很好: 但如果我将其用作模板参数(如上所示)http://en.cppreference.com/w/cpp/types/enable_if ) 那么我有以下错误: 我不知道第二个版本出了什么问题。