2012-06-19 60 views
1

Boost的signals2庫定義了一個很好的方法來通過其擴展功能的其他參數(通過其參數庫)。當我的代碼中這些替代參數中的一個是相當普遍的時候,我想要做一個幫助來進一步簡化使用;例如,以指定備用互斥I型可以這樣做:指定升壓信號的備用默認值2

namespace bs2 = boost::signals2; 
template<typename Signature> 
struct my_signal 
{ 
    typedef typename bs2::signal_type<Signature, 
     bs2::keywords::mutex_type<my_mutex> >::type type; 
}; 

my_signal<void()>::type some_signal; 

不幸的是通過這樣做,我也「丟失」以指定其它信號參數(如組合型)替代值的能力,而不回到冗長的語法或者定義額外的元函數,比如my_signal_with_combiner或者其他的東西(這看起來很愚蠢)。我不認爲我可以使用默認的模板參數值做到這一點,因爲Combiner的默認值需要拆分Signature以獲取返回類型。 (理想情況下,我希望某些東西適用於任何其他參數,而不僅僅是組合器)。

所以,「真正的」問題是:是否有一種(簡單)方式來定義像signal_type它的行爲與它的行爲相同,但對於其中一個參數具有不同的默認值? (理想情況下,不應該要求如果Boost.Signals2在未來增加更多的參數發生變化。)

(此外,沒有C++ 11吧。還是用舊的編譯器。)

回答

0

我工作出於以下,這似乎是伎倆。仍有意改善的答案,雖然:

有我有點疑惑就是爲什麼在構造函數中使用「combiner_type」的要求在類型聲明中明確的範圍界定
namespace bs2 = boost::signals2; 

template < 
    typename Signature, 
    typename A1 = boost::parameter::void_, 
    typename A2 = boost::parameter::void_, 
    typename A3 = boost::parameter::void_, 
    typename A4 = boost::parameter::void_, 
    typename A5 = boost::parameter::void_, 
    typename A6 = boost::parameter::void_ 
    > 
struct my_signal_type : public bs2::signal_type<Signature, A1, A2, A3, A4, A5, A6> 
{ 
    typedef typename boost::parameter::value_type<args, bs2::keywords::tag::mutex_type, my_mutex>::type mutex_type; 

    typedef bs2::signal< 
     signature_type, 
     combiner_type, 
     group_type, 
     group_compare_type, 
     slot_function_type, 
     extended_slot_function_type, 
     mutex_type 
    > type; 
}; 

template < 
    typename Signature, 
    typename A1 = boost::parameter::void_, 
    typename A2 = boost::parameter::void_, 
    typename A3 = boost::parameter::void_, 
    typename A4 = boost::parameter::void_, 
    typename A5 = boost::parameter::void_, 
    typename A6 = boost::parameter::void_ 
    > 
class MyEvent : public my_signal_type<Signature, A1, A2, A3, A4, A5, A6>::type 
{ 
public: 
    typedef typename my_signal_type<Signature, A1, A2, A3, A4, A5, A6>::type base_type; 

    explicit MyEvent(const typename base_type::combiner_type& combiner = combiner_type()) 
     : base_type(combiner) 
    { 
    } 
}; 

一兩件事 - 然後它不爲默認參數。 (在這裏刪除「typename」或「base_type ::」觸發標準的「default-int」錯誤(這意味着「看起來不像我知道的類型」)。這很奇怪,因爲它在基類中定義我猜這是一些奇怪的模板部分實例化的東西。