gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:14:56 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com