2011-06-20 88 views
2

我嘗試編寫一個以函數元組爲參數的類,併爲該函數的所有argument_type s重載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