繁体   English   中英

成员函数的boost :: enable_if,重载返回类型

[英]boost::enable_if on member function, overload return type

我希望能够使用boost::enable_if来关闭/打开某些方法。

对于整数类型,我想从operator()返回TypeToReturn对于其他类型我想返回const TypeToReturn&

这是我的尝试:

template<typename T>
struct Holder{
    typedef T type;
};


template<typename First,
         typename TypeToReturn = typename Holder<First>::type>

struct SuperClass{

    typename boost::enable_if<boost::is_integral<TypeToReturn> >::type 
    operator()(int& someParameterNotImportant) const
    {
        // stuff
    }

    const typename boost::disable_if<boost::is_integral<TypeToReturn> >::type&
    operator()(int& someParameterNotImportant) const
    {
        // stuff
    }
};

我收到错误,这些功能不能超载等。

我甚至不确定这种尝试是否朝着良好的方向迈进。

编辑:在第一个建议后,我正在修改后添加代码,仍然给出“const typename boost :: disable_if .....不能重载”的问题

template<typename T>
struct Holder{
    typedef T type;
};


template<typename First,
         typename TypeToReturn = typename Holder<First>::type>

struct SuperClass{

    typename boost::enable_if<boost::is_integral<TypeToReturn>, TypeToReturn >::type 
    operator()(int& someParameterNotImportant) const
    {
        // stuff
    }

    const typename boost::disable_if<boost::is_integral<TypeToReturn>, TypeToReturn >::type&
    operator()(int& someParameterNotImportant) const
    {
        // stuff
    }
};

SFINAE适用于模板方法。 你的不是。

在C ++ 11中,我们可以使用函数的默认模板来处理:

template<typename First,
         typename TypeToReturn = typename Holder<First>::type>
struct SuperClass
{
    template <typename T = TypeToReturn>
    typename boost::enable_if<boost::is_integral<T>, T>::type 
    operator()(int& someParameterNotImportant) const
    {
        // stuff
    }

    template <typename T = TypeToReturn>
    const typename boost::disable_if<boost::is_integral<T>, T>::type&
    operator()(int& someParameterNotImportant) const
    {
        // stuff
    }
};

if constexpr ,C ++ 17将允许更简单的语法,

和C ++ 20将允许requires丢弃该方法由于性状。

在C ++ 03中,我建议使用标签调度:

template<typename First,
         typename TypeToReturn>
TypeToReturn helper(int& someParameterNotImportant, boost::true_type)
{
// stuff
}

template<typename First,
         typename TypeToReturn>
const TypeToReturn& helper(int& someParameterNotImportant, boost::false_type)
{
// stuff
}


template<typename First,
         typename TypeToReturn = typename Holder<First>::type>
struct SuperClass
{
    typename boost::conditional<boost::is_integral<TypeToReturn>::value,
                                TypeToReturn,
                                const TypeToReturn&>::type 
    operator()(int& someParameterNotImportant) const
    {
        return helper<First, TypeToReturn>(someParameterNotImportant,
                                           boost::is_integral<TypeToReturn>());
    }
};

您需要为enable_if提供一个类型

typename boost::enable_if<boost::is_integral<TypeToReturn>, TypeToReturn >::type 

否则默认为无效

为了使它真正起作用,你需要自己创建运算符的模板函数,以允许SFINAE通过这对于标签中所述的c ++ 03不起作用。

template <typename Ret = TypeToReturn>
typename boost::enable_if<boost::is_integral<Ret>,Ret >::type 
operator()(int& someParameterNotImportant) const

或者使用虚拟变量并使运算符因参数而不是返回值而不同。 但仍然保持模板。 这适用于c ++ 03

template<typename T>
    TypeToReturn operator()(T& someParameterNotImportant, typename boost::enable_if<boost::is_integral<TypeToReturn>,T >::type* = 0) const

您也可以在此处添加对T为int的检查以发出编译时错误(如果不是)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM