2012-03-06 15 views
2

は、私は以下のクラスがあるとしC++テンプレート:戻り値の型は、入力タイプによって決定しながら、過負荷演算子+は、

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

私は演算子+そうに過負荷をかけることを願っている2つの入力がである場合に

Foo<B1, F1> 
それぞれ

Foo<B2, F2>, 

、Iは、戻り値は

0の一種である希望
Foo<max(B1, B2), max(F1, F2)>. 

または

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

ような何か任意のヒント?

+0

.... T T ::演算子+(のconst T&B)のconst; - http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B –

+0

可能な複製http://stackoverflow.com/q/4421706/1155650 –

+0

私のポスターが正しく表示されない –

答えて

5

をジャストオペレータ+戻り値の型に新しいタイプを計算し、比較のためにMPLを使用 また、あなたがそのために友人を必要としないでもないあなたのオペレータ+可変にする必要があります。簡単なクラスと

簡単な例:

#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; 
} 

は、それが面倒であるかに気づきます。 また、これはpre_C++ 11自動で書き留めて少し複雑に+の戻り値の型を作る:この場合、通常のイディオムがUEにあるEDITたび

#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; 

可能代わりに生の値のMPL整数型を後押し。 もう一つの古典的なことは、これをプロトコルのresult_ofに続く関数オブジェクトにすることです。そのため、戻り値の型を不透明な方法で計算するのに便利なメタ関数があります。

+0

C++ 11で同じことを達成する方法を知っていますか? –

1

私はこのようなものを探していると思います。

foo a,b,c; 
a = b + c; 

このため、 '='演算子もオーバーロードする必要があります。

enter code here 
    template <typename t,typename f> 
    foo& operator + (const foo& source) 
    { 
     //add the date members 
     return *this; 
    } 

をオーバーロードし、目的の操作を実行できるはずです。

+0

私のポスターが正しく表示されませんでした –

+0

私はあなたがオーバーロードする必要はないと思う=演算子。クラスオブジェクトは同じ型のクラスオブジェクトに割り当てられます。デフォルト演算子=正常に動作するはずです –

+0

@Rohit:C++コンパイラは=演算子を提供しますが、デフォルトのコピーコンストラクタと同じように浅いコピーを行いますので、オペレータを過負荷にすることをお勧めします。 – ken

1

これを試してみてください:かなりまっすぐ進む

#include <algorithm> 
#include <iostream> 

template <unsigned char A, unsigned char B> 
struct max { 
    enum { value = A>B ? A : B}; 
}; 

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

template <unsigned char B, unsigned char F> 
std::ostream& 
operator<<(std::ostream& os, Foo<B, F>) { 
    return os << "Foo<" << (int)B << "," << (int)F << ">"; 
} 

template <unsigned char B1, unsigned char F1, 
      unsigned char B2, unsigned char F2> 
Foo<max<B1, B2>::value, max<F1, F2>::value> 
operator+(const Foo<B1, F1>&, const Foo<B2, F2>&) 
{ 
    return Foo<max<B1, B2>::value, max<F1, F2>::value>(); 
} 

int main() { 
    Foo<1,3> foo13; 
    Foo<0,4> foo04; 

    std::cout << foo13 << "\n"; 
    std::cout << foo04 << "\n"; 
    std::cout << foo13 + foo04 << "\n"; 
} 
関連する問題