2011-06-20 12 views
2

関数のタプルを引数とするクラスを作成しようとしましたが、関数のすべてargument_typeに対してはoperator()がオーバーロードされます。今、これは次のようになります。基本クラスメンバを再帰的に再表示します

template<typename T> 
struct holder { 
    T t; 
}; 

template<typename T, std::size_t i> 
struct overload_helper : public holder<T>, public overload_helper<T, i - 1> { 
    overload_helper(T t) : holder<T>({t}) {}; 
    typedef typename std::tuple_element<i - 1, T>::type inner_type; 
    typename inner_type::result_type operator()(typename inner_type::argument_type x) { 
    return std::get<i - 1>(holder<T>::t)(x); } 
}; 

template<typename T> 
struct overload_helper<T, 1> { 
    typedef typename std::tuple_element<0 ,T>::type inner_type; 
    typename inner_type::result_type operator()(typename inner_type::argument_type x) { 
    return std::get<0>(holder<T>::t)(x); } 
}; 

template<typename T> 
struct overload : public overload_helper<T, std::tuple_size<T>::value> 
{ 
    typedef void result_type; 
    overload(const T& t) : overload_helper<T, std::tuple_size<T>::value>(t) { } 
}; 


int main() { 
    auto all = make_overload(std::make_tuple(
       std::function<void(double)>([](double i) { 
       std::cout << "double" << std::endl; 
        }), std::function<void(int)>([](int i) { 
        std::cout << "int" << std::endl; }))); 

    all(1); //fails 
    all(1.0); 
} 

問題は、基本クラスがoperator()の各再帰的定義を隠しているということです。 usingですべての定義を再帰的に再表示することは可能ですか、テンプレートoperator()を使用し、boost::mplで適切なオーバーロードを選択する唯一の方法ですか?

+0

テンプレートで 'base :: operator()'を使って追加してみましたか? –

答えて

6

using overload_helper<T, i - 1>::operator()overload_helperはあまりにも曖昧でないので、仕事をしなければなりません。

+0

これはうまくいくように見えますが、現在、「非静的なデータメンバーの無効な使用」があります。これは、継承階層に問題があることを示唆しています。ありがとう。 – pmr

+0

@ pmr:あなたはおそらくこの答えを受け入れ、何が間違っているのか分からなければ次のものに進むべきです。取得しているエラーは、元の質問とはまったく関係ありません。 (通常、このエラーは、オブジェクトなしでメンバ関数を呼び出そうとしていることを意味します。つまり、 'struct test {foo(){}}; int main(){test :: foo();}') –

+0

@Davidこれはそうではありませんでした。私のコードには他の問題がありました。まずXeoの答えが正しかったことを確認するためにそれらを試しました。 – pmr

関連する問題