C++相談室 part69

このエントリーをはてなブックマークに追加
677デフォルトの名無しさん
下の様な感じで合成関数を作ろうと思ったのですが、
error C2678: 二項演算子 '*' : 型 'composite_impl<result_type_,arg_type_>' の左オペランドを扱う演算子が見つかりません
とエラーが出ます。どうやって回避すればいいのでしょうか?
678デフォルトの名無しさん:2009/06/01(月) 14:33:55
struct composite_type{};
template<typename result_type_, typename arg_type_>
struct composite_impl{
typedef result_type_ result_type; typedef arg_type_ arg_type; typedef result_type (*fn_type)(arg_type);
static fn_type &fn_holder(){ static fn_type fn; return fn; }
result_type operator ()(arg_type a) const{ return (fn_holder())(a); }
};
template<typename result_type_a_, typename result_type_b_, typename arg_type_b_>
struct composite_impl<result_type_a_, composite_impl<result_type_b_, arg_type_b_> >{
typedef result_type_a_ result_type; typedef arg_type_b_ arg_type; typedef result_type (*fn_type)(arg_type);
static fn_type &fn_holder(){ static fn_type fn; return fn; }
result_type operator ()(arg_type a) const{ return (fn_holder())(composite_impl<result_type_b, arg_type_b_>()(a)); }
};
template<typename result_type, typename arg_type>
inline composite_impl<result_type, arg_type> operator *(composite_type, result_type (*fn)(arg_type)){
composite_impl<result_type, arg_type> a; a.fn_holder() = fn; return a;
}
template<typename result_type_a, typename result_type_b, typename arg_type_b>
inline composite_impl<result_type_a, composite_impl<result_type_b, arg_type_b> > operator *(composite_impl<result_type_a, result_type_b> a, result_type_b (*fn)(arg_type_b)){
composite_impl<result_type_a, composite_impl<result_type_b, arg_type_b> > a; a.fn_holder() = fn; return a;
}
composite_type composite;
#include <iostream>
#include <cstring>
int fn_a(int a){ return a * a; }
char *fn_b(int a){ static char str[0xFF]; std::sprintf(str, "%d", a + 1); return str; }
int main(){ std::cout << (composite * fn_a * fn_b)(2) << std::endl; return 0; }