gpt4 book ai didi

C++ 模板 : overload operator +, 而返回类型由输入类型决定

转载 作者:太空狗 更新时间:2023-10-29 23:53:42 25 4
gpt4 key购买 nike

假设我有以下类(class)

template<unsigned char B, unsigned char F>
class Foo
{
.....
}

我希望重载operator+,这样如果两个输入都是

Foo<B1, F1> 

Foo<B2, F2>, 

分别,我希望返回值的类型是

Foo<max(B1, B2), max(F1, F2)>. 

或者类似的东西

Foo<max(B1-F1, B2-F2)+max(F1, F2), max(F1, F2)>. 

有什么建议吗?

最佳答案

只需在 operator+ 返回类型中计算您的新类型,并使用 MPL 进行比较此外,您不需要 friend ,您的 operator+ 也不需要是可变的。

简单类的简单示例:

#include <boost/mpl/max.hpp>

template<unsigned char B, unsigned char F>
class Foo
{};

template< unsigned char B1, unsigned char F1
, unsigned char B2, unsigned char F2
>
Foo< boost::mpl::max_<boost::mpl_::char_<B1>, boost::mpl_::char_<B2> >::value
, boost::mpl::max_<boost::mpl_::char_<F1>, boost::mpl_::char_<F2> >::value
>
operator+(Foo<B1,F1> const& a, Foo<B2,F2> const& b)
{
Foo< boost::mpl::max_<boost::mpl_::char_<B1>, boost::mpl_::char_<B2> >::value
, boost::mpl::max_<boost::mpl_::char_<F1>, boost::mpl_::char_<F2> >::value
> that;
return that;
}

现在,注意它是多么的麻烦。在这种情况下,一个常用的习惯用法是尽可能使用 Boost MPL 积分类型而不是原始值

#include <boost/mpl/max.hpp>

template<class B, class F>
class Foo
{};

template< class B1, class F1
, class B2, class F2
>
Foo< typename boost::mpl::max_<B1, B2>::type
, typename boost::mpl::max_<F1, F2>::type
>
operator+(Foo<B1,F1> const& a, Foo<B2,F2> const& b)
{
Foo< typename boost::mpl::max_<B1, B2>::type
, typename boost::mpl::max_<F1, F2>::type
> that;
return that;
}

Foo< boost::mpl::int_<4>, boost::mpl::int_<8> > x;

编辑:此外,这使得 + 的返回类型在 pre_C++11 auto 中写起来有点复杂。另一个经典的东西是将它变成一个遵循 result_of 协议(protocol)的函数对象,这样你就有了一个方便的元函数来以不透明的方式计算返回类型。

关于C++ 模板 : overload operator +, 而返回类型由输入类型决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9578668/

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