默认模板当您想要null时的参数

时间:2014-03-12 17:13:05

标签: c++ templates arguments

我正在开发一个具有以下类模板的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值不在模板定义中。

建议?

0 个答案:

没有答案