2012-06-19 4 views
1

부스트의 signals2 라이브러리는 확장 된 기능 중 일부 (매개 변수 라이브러리를 통해)에 대체 매개 변수를 전달하는 좋은 방법을 정의합니다. 이러한 대체 매개 변수 중 하나가 내 코드에서 매우 평범한 경우 사용을 더 단순화하는 도우미를 만들고 싶습니다. 예를 대체 뮤텍스 유형을 지정하는 나는이 작업을 수행 할 수 있습니다부스트 시그널에 대한 대체 디폴트 지정하기 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"오류가 발생합니다 (즉 "알고있는 유형과 유사하지 않음"을 의미 함). 기본 클래스에 정의되어 있으므로 이상합니다 일부 이상한 템플릿 - 부분 - 인스턴스화 것 같아요.