c++ - 成员函数上的 boost::enable_if,重载返回类型

标签 c++ templates boost template-meta-programming c++03

我希望能够使用 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
    }
};

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

并且 C++20 将允许要求由于特征而放弃该方法。

在 C++03 中,我建议改用标签分派(dispatch):

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>());
    }
};

关于c++ - 成员函数上的 boost::enable_if,重载返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977220/

相关文章:

c++ - async_accept 处理程序的用法

C++ vector 不保留从循环接收的值

c++ - 为什么我可以使用 POSIX 创建一个比安装在/dev/shm 上的大小更大的共享内存?

c++ - 使用虚函数和重新定义的区别

email - 是否可以为 mailchimp 编写拖放模板?

c++ - 如何使用模板函数减去两个对象?

C++ bad_cast 异常将 *this 转换为派生模板类

c++ - 让 Boost asio 工作

c++ - 具有纯虚拟回调的线程基类,在销毁时停止 c++

C++ - 错误 C4430 : missing type specifier (for a constructor? ??)