我正在开发一个具有以下类模板的C ++项目。注意,最后一个参数应该是可选的,如果没有设置值,我们默认为0。
我知道在C ++ 11之前,这对于C ++标准来说是非法的,而我正在使用的GCC版本也无法升级;这是嵌入式软件环境,工具链在一定程度上由外部公司维护。
template< typename TVal, typename Tobj, TVal (Tobj::*TGet)(), bool (Tobj::*TSet)(TVal) = 0 >
class TPropertyEx
{
typedef bool (Tobj::*pSetter)(TVal);
typedef TVal (Tobj::*pGetter)();
Tobj *pObj;
pGetter Get;
pSetter Set;
explicit TPropertyEx(Tobj *pobj):mReadOnly(false),pObj(pobj),Get(TGet),Set(TSet){}
explicit TPropertyEx(Tobj *pobj, const TVal &value):mReadOnly(false),pObj(pobj),Get(TGet),Set(TSet)
// rest omitted for brevity
这就是我打算使用TPropertyEx
类:
class SomeClass
{
private:
// omitted for brevity
public:
TPropertyEx<unsigned int, SomeClass, &SomeClass::iCount> Count;
}
请注意,Count
“属性”应该是只读属性;你永远不会把它设置成任何东西。
因为它(不允许传递空模板参数),我必须像这样编写上面的代码:
TPropertyEx<unsigned int, SomeClass, &SomeClass::iCount, &SomeClass::iCountRO> Count;
然后我必须编写iCountRO
函数,只做返回 false 。
我已经尝试了一些事情,看看我是否可以避免传递TSet
的值,但我没有获胜。以下是我尝试过的一些事情:
template<typename TVal>
static bool ReadOnlySet(TVal val){ return false; }
template< typename TVal, typename Tobj, TVal (Tobj::*TGet)(), bool (Tobj::*TSet)(TVal) = &ReadOnlySet >
class TPropertyEx
{
产生错误:
error: could not convert template argument 'ReadOnlySet' to ....
我试过这个:
template< typename TVal, typename Tobj, TVal (Tobj::*TGet)(), bool (Tobj::*TSet)(TVal) = &TPropertyEx::ReadOnlySet >
class TPropertyEx
{
private:
bool ReadOnlySet(TVal val){return false;}
产生
error: 'TPropertyEx' has not been declared; which is dubious as TPropertyEx would not be TObj:: so I get why the compiler complains on this too.
如果没有设置任何值,或者我将不得不忍受总是指定TSet
值,我怎么能将TSet
设置为某个默认函数?
我有一个但尚未审查的想法是对TPropertyEx
进行模板特化,TSet
值不在模板定义中。
建议?